In matematica a 32 bit, le operazioni matematiche di base di addizione e moltiplicazione vengono calcolate implicitamente mod 2^32, il che significa che i risultati saranno l'ordine più basso bit dell'aggiunta o della moltiplicazione.Calcolo (a * b) mod c velocemente per c = 2^N + -1
Se si desidera calcolare il risultato con un modulo diverso, è possibile utilizzare qualsiasi numero di classi BigInt in diverse lingue. E per i valori a, b, c < 2^32 è possibile calcolare i valori intermedi in 64 bit di lunghezza e utilizzare% di operatori integrati per ridurre a destra la risposta
Ma mi è stato detto che ci sono trucchi speciali per il calcolo efficiente di un * b mod C quando C è del formato (2^N) -1 o (2^N) +1, che non usano la matematica a 64 bit o una libreria BigInt e sono abbastanza efficienti, più che una valutazione arbitraria del modulo, e anche calcolare correttamente i casi che normalmente sovrasfrutterebbero un int a 32 bit se si stesse includendo la moltiplicazione intermedia.
Sfortunatamente, nonostante abbia sentito che questi casi speciali hanno un metodo di valutazione veloce, non ho in realtà trovato una descrizione del metodo. "Non è quello a Knuth?" "Non è da qualche parte su Wikipedia?" sono i mormorii che ho sentito.
Apparentemente è una tecnica comune in generatori di numeri casuali che stanno facendo moltiplicazioni di un * b mod 2147483647, poiché 2147483647 è un numero primo uguale a 2^31 -1.
Quindi chiederò agli esperti. Cos'è questo astuto metodo speciale multiply-with-mod di cui non riesco a trovare nessuna discussione?
E ancora non capisco la matematica dietro questo è il motivo per cui ho abbandonato la matematica minore al college ... –
Beh, è un po 'come ottenere il resto quando dividendo per 9 (10-1). Basta aggiungere le cifre. Ora in questo caso, invece di base 10, o base 2, sei "base" 2^N – FryGuy