![]() |
Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
Hi Leute
ich sehe mich wieder mal vor ein problem gestellt wo ich den fehler nicht finde!!!! also ich habe drei zahlen die nach rsa entschlüsselt werden soll 299 soll mit 173 und 481 entschlüsslt werden!!! Also 299^173 MOD 481 = entschlüsselt . es gibt aber folgendes problem und zwar das 299^173 eine für longint zu hohe zahlen rauskommen deshalb habe ich den extended benutzt weil ich nur mit delphi3 programmiere und int64 da noch nicht vorhanden sind... also lasse ich den mod per hand berchnen da er sonst nur für integer konzipiert ist: achso und 299^173 ist schon mit einer weiteren prozedur berechnet und heisst bei mir 'k1'. b:=481;
Delphi-Quellcode:
und für genau die zahlen wie oben schon angegeben kommt bei mir für a=0 raus was nicht stimmt es müsste nämlich 65 rauskommen......das funktioniert sogar wenn ich das mit dem windows taschenrechner berechne!!!!
a:=k1/b;
a:=fract(a); a:=a*b; a:=round(a); könnt ihr mir helfen?????? ich hoffe die infos reichen wenn nicht meldet euch!!! DAnke schon mal im voraus für eure Hilfe!!!! MFG Kamikaze |
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
Zitat:
Du musst bei Integerarithmetik bleiben! :warn: 299^173 ist 299*299*299*...299 (173 Faktoren) Das ist eine riesige Zahl!! Es gibt nun sicherlich mathmatische Möglichkeiten a^b mod c auszurechnen ohne dass man die Zahl a^b wirklich berechnet. Tipp: die einzelnen Multiplikationen und Modulooperationen lassen sicher verschachteln. Dabei wird der Integerbereich nie verlassen. |
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
Das hatten wir vor kurzem schon mal. Such einfach nach "Diskrete Exponentialfunktion". Da ist ein schöner, langer Beitrag von mir mit einem Beispiel.
EDIT: Ich hab heute gute Laune und geb dir deshalb gleich den Link: ![]() |
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
Moin,
kurz gesagt: du brauchst keinen Extended oder aehnliches. Im Gegenteil: du musst nur die Integer-Zahlen abspeichern koennen, mit denen du arbeitest, und sonst nichts. Schliesslich ist
Code:
auch zu umschreiben als
a^b % c
Code:
Wir haben also eine rekursive Gleichung, die du mit einigen Optimierungen auf die Variante aus Wikipedia zurueckfuehren kannst. Wenn du das also bis ans Ende fortfuehrst, wirst du kein einzges Mal eine Potenz berechnen muessen.
((a^(b-1) % c) * (a % c)) % c
Greetz alcaeus |
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
Zitat:
Zitat:
In einer sache hast du aber recht: sowas hatten wir letztlich schon: ![]() D.h. eigentlich wie alci schon geschrieben hat:
Code:
vllt. stell ich heut noch ne nicht-rekursive Gleichung dafuer auf. :)
(a ^ b) % c = ((a^(b-1) % c) * (a % c)) % c
greetz Mike |
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
hi,
ich hab das ganz ähnliche Problem... ich habs auch mal mit der Gleichung ausprobiert allerdings: wie soll dazu der rekursive Rahmen aussehen ? mfg |
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
Ich habs nu nicht ganz Geblickt,
aber ich Poste euch mal wie ich das mache.
Delphi-Quellcode:
Ich hoffe das hilft.
Function XHochYModZ(x, y, z: integer): Integer;
Var i, e: INteger; Begin e := 1; For i := 1 To y Do e := (e * x) Mod z; result := e; End; |
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
vielen Dank... manchmal hat man einfach n Brett vorm Kopf... :wall:
|
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
Evtl liegt es an dem Div 2 weil das doch noch mit graden zahlen funktioniert. Teste mal it x*0.5.
Edit hat sich ja schon gelöst... |
Re: Den MOD per Hand berechnen! -> falsches Ergebnis!!!!
Delphi-Quellcode:
Das ist defakto inpraktikabel und ineffizient. Wir führen damit Y mal eine modulare Multiplikation aus. Und stelle dir vor Y wäre wie bei RSA üblich circa 2^1024 groß.
Function XHochYModZ(x, y, z: integer): Integer;
Var i, e: INteger; Begin e := 1; For i := 1 To y Do e := (e * x) Mod z; result := e; End; Der Vorschlag von 3_of_8 ist da schon weitaus besser. Dieser führt im Durchschnitt Ln2(Y) mal eine modulare Multiplikation und Ln(Y)/2 eine Quadrierung durch wenn man nicht wie sein Vorschlag die Rechts nach Links Methode sondern die Links nach Rechts Methode anwendet. Ich kenne das aber und einen anderen Namen -> "Left to Right/Right to left binary Exponentation" also einfach gesagt eine binäre Exponentation. Ich hatte hier vor langer Zeit schonmal einen Source für Int64 reingestellt, ![]() Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz