[ZT] n^k mod p = k ---- Wie?

Neue Frage »

Aldebaran Auf diesen Beitrag antworten »

Meine Frage:
Gegeben ist:

Kurz gefragt, gibt es einen effizienten Weg, k zu berechnen, falls überhaupt eins existiert?

Um es zu verdeutlichen hab ich ein kleines Programm (in IDLE für Python 3.5) geschrieben:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
>>> n = 7
>>> m = 100
>>> for k in range(m-1, 0, -1):
	if n**k % m == k:
		print (n, k)
		break

7 43
>>> print (7**43)
2183814375991796599109312252753832343


Dieses Beispiel sucht das größte k, für welches die Kongruenz gilt. Wenn man aber große Moduli hat oder mehrere Werte in Folge berechnen will, benötigt diese Methose unsäglich viel Zeit.

Meine Ideen:
So richtig hab ich noch keine Idee. Ich dachte erst an Logarithmen, hab sie aber auch schnell wieder verworfen. Außerdem kam mir Pollards Rho Algorithmus für Diskrete Logarithmen in den Sinn. Das hat mich aber auch nicht weit gebracht.

Hätte von euch jemand eine Idee?

Zwei Beiträge zusammengefasst. Steffen


Ich hab gesehen, dass ich in der Beschreibung p und im Code m für den Modulus verwendet hab. Außerdem hab ich vergessen zu erwähnen, dass der Exponent k kleiner als der Modulus sein soll. Das geht aus dem Code hervor, fehlt aber in der Beschreibung.
HAL 9000 Auf diesen Beitrag antworten »

sind gegeben und gesucht? Und ist prim sowie ? verwirrt

Ziemlich ungewöhlich, dass sowohl in Exponent als auch Potenzerergebnis auftaucht. Eins kann man zumindest feststellen:

Für gilt und folglich .

Zu gegebenen sind also alle Werte mit Lösung deiner Gleichung - und letztlich nur die!


Ist allerdings nicht prim (wie in deinem Beispiel ), dann ist es etwas komplizierter.
Aldebaran Auf diesen Beitrag antworten »

Meine Annahme ist, dass man für komposite Moduli die Primfaktoren dessen betrachtet und dann den Chinesischen Restsatz anwendet.
HAL 9000 Auf diesen Beitrag antworten »

Primfaktoren allein wird nicht reichen, allenfalls Primfaktorpotenzen.
Aldebaran Auf diesen Beitrag antworten »

Wenn Modulus = 100, dann also 2^2 = 4 und 5^2 = 25 betrachten....
Aldebaran Auf diesen Beitrag antworten »

Ich hab das mal mit den Primfaktorpotenzen probiert, zumindest so wie ich mir das ausgemalt hab. Wahrscheinlich war das alles andere als richtig verwirrt

Ich hab dazu mein Python-Code etwas geändert:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
def expmod(n, m):
    for k in range(m-1, 0, -1):
        if pow(n, k, m) == k:
            return k
    return -1

#
MOD = 10**2
M1 = 2**2
M2 = 5**2

b = 7
print (expmod(b, MOD))
print (expmod(b, M1))
print (expmod(b, M2))


Als Ergebnis bekomme ich
code:
1:
2:
3:
43
3
-1

angezeigt. Und ab hier weiß ich nicht so recht weiter verwirrt
 
 
HAL 9000 Auf diesen Beitrag antworten »

Weißt du eigentlich, was du da tust?

Wenn du Lösungen von suchst, und das auf die Primfaktorpotenzen von herunterbrechen willst, dann musst du bei Primfaktorzerlegung nicht nur einfach die Kongruenzen

für

nach irgendwelchen Lösungen abklopfen, sondern nach solchen , die gleichzeitig (!) alle Kongruenzen lösen, d.h. für ! Unterschiedliche für unterschiedliche nützen in Bezug auf das Originalproblem rein gar nichts. unglücklich
Aldebaran Auf diesen Beitrag antworten »

Wow, das war peinlich Finger2 ich gehe das Ganze noch mal durch und melde mich dann -hoffentlich mit nicht ganz so viel Blödsinn- wieder
Neue Frage »
Antworten »



Verwandte Themen