Nel mio progetto, una parte del problema è lì. Ma per semplificare, qui il problema viene formulato. Esistono due numeri interi co-prime positivi: a
e b
, dove a < b
. Multipli di a
da 1 a b-1
sono elencati seguito da funzionamento modulo da b
.Algoritmo/formula veloce per gamma seriale di moduli di numeri co-prime
a mod b
, 2*a mod b
, 3*a mod b
, ..., (b-1)*a mod b
Ora, c'è un altro intero, dire n (1 <= n < b)
. Attraverso i primi numeri n
nell'elenco, dobbiamo trovare quanti numeri è inferiore a, ad esempio m
(1 <= m < b
). Questo può essere fatto in approccio a forza bruta, dando così un O(n)
.
Un esempio:
a=6, b=13, n=8, m=6
List è:
6, 12, 5, 11, 4, 10, 3, 9, 2, 8, 1, 7
Questa è una permutazione dei numeri da 1 a 12 per il funzionamento del modulo di qualsiasi due co-primi produce un permutazione dei numeri se includiamo un altro numero, ovvero 0
. Se prendiamo lo a= 2, b=13
, la lista sarebbe stata 2, 4, 6, 8, 10, 12, 1, 3, 5, 7, 9, 11
, che fornisce uno schema. Considerando che se a
e sono molto grandi (nel mio progetto possono andare fino a 10^20), quindi non ho idea di come dedurre un modello di numeri così grandi.
Ora tornare all'esempio, si prende la prima n = 8
numeri dalla lista, che dà
6, 12, 5, 11, 4, 10, 3, 9
Applicando l'operatore less-than
con m = 6
, dà il numero totale dei numeri inferiori a m
essere 3 come spiegato di seguito nell'elenco
0, 0, 1, 0, 1, 0, 1, 0
dove 0 si riferisce alle non essere inferiore a m
e 1 si riferisce ad essere inferiore a m
.
Dal momento che, l'algoritmo di cui sopra è un O(n)
, che non è accettabile per la gamma di [0, 10^20]
, così può fare la comunità dare un suggerimento/indizio/suggerimento mi consentano di raggiungere una soluzione O(log n)
, o meglio ancora la soluzione O(1)
?