In meinem Projekt ist ein Teil des Problems da. Aber zur Vereinfachung wird hier das Problem formuliert. Es gibt zwei positive Co-Primzahl-Ganzzahlen: a
und b
, wobei a < b
. Ein Vielfaches von a
von 1 bis b-1
ist aufgeführt, gefolgt von einer Moduloperation durch b
.Schneller Algorithmus/Formel für den seriellen Bereich von Modulo von Co-Primzahlen
a mod b
, 2*a mod b
, 3*a mod b
, ..., (b-1)*a mod b
Nun gibt es eine weitere ganze Zahl ist, sagen n (1 <= n < b)
. Durch die ersten n
Zahlen in der Liste müssen wir herausfinden, wie viele Zahlen kleiner sind als, sagen m
(1 <= m < b
). Dies kann in Brute-Force-Ansatz erfolgen, wodurch sich ein O(n)
ergibt.
Ein Beispiel:
a=6, b=13, n=8, m=6
Liste ist:
6, 12, 5, 11, 4, 10, 3, 9, 2, 8, 1, 7
Dies ist eine Permutation der Zahlen von 1 bis 12 ist, weil Modulus Betrieb von irgendwelchen zwei co-Primzahlen a produziert Permutation von Zahlen, wenn wir eine andere Zahl einschließen, also 0
. Wenn wir a= 2, b=13
nehmen, dann wäre die Liste 2, 4, 6, 8, 10, 12, 1, 3, 5, 7, 9, 11
, was ein Muster ergibt. Während, wenn a
und b
sind sehr groß (in meinem Projekt können sie bis zu 10^20 gehen), dann habe ich keine Ahnung, wie ein Muster von so großen Zahlen abzuleiten.
Nun zurück zum Beispiel bekommen, nehmen wir die ersten n = 8
Nummern aus der Liste, die
6, 12, 5, 11, 4, 10, 3, 9
Anwendung des less-than
Operator mit m = 6
gibt, gibt es die Gesamtzahl der Zahlen kleiner als m
Wesen 3 erläutert, wie in der unten stehenden Liste
0, 0, 1, 0, 1, 0, 1, 0
wobei 0 bedeutet nicht weniger als m
und 1 bezieht sich auf weniger als m
.
Da oben ist der Algorithmus ein O(n)
, die für den Bereich von [0, 10^20]
nicht akzeptabel ist, so kann die Gemeinschaft einen Hinweis/Hinweis/Tipp geben mir zu ermöglichen, eine O(log n)
Lösung zu erreichen, oder noch besser O(1)
Lösung?