![]() |
Re: Eine BigInt Klasse + RSA-Beispiel
Zitat:
Die aktualisierte Version ist jetzt online. |
Re: Eine BigInt Klasse + RSA-Beispiel
Kann jemand diesen Thread loeschen bitte von mir?
|
Re: Eine BigInt Klasse + RSA-Beispiel
Zitat:
Gruß peanut. |
Re: Eine BigInt Klasse + RSA-Beispiel
Ich denke Mackhack hat sich verschrieben, er meinte nicht den Thread löschen sondern nur seinen Post. ;)
|
Re: Eine BigInt Klasse + RSA-Beispiel
Ich hoffe doch :wink: Ich werde bei so etwas aber immer hellhörig, da in der Vergangenheit bereits BigInt-Klassen anderer Autoren wegen irgendwelcher Patentansprüche nicht mehr öffentlich als Download angeboten werden durften....
|
Re: Eine BigInt Klasse + RSA-Beispiel
Ja sorry,
meinte meinen Post net den ganzen Thread. Entschuldige fuer den erhoeten Puls den ich dir wohl verpasst habe! |
Re: Eine BigInt Klasse + RSA-Beispiel
hmm... wie kann ich eigendlich zu diesem BigInt eine zahl addieren...?
also sowas irgendwie:
Delphi-Quellcode:
weil bei der add-methode kann ja nur ein weiterer BigInt übergeben werden...
MyBigInt.Add(548);
|
Re: Eine BigInt Klasse + RSA-Beispiel
Hallo!
Dies Funktion habe ich damals nicht implementiert, wäre allerdings ganz sinnvoll - muss ich zugeben :) Ich schau mal, was ich da machen kann... braucht aber ein paar Stunden/Tage... |
Re: Eine BigInt Klasse + RSA-Beispiel
Par Sachen sind mir aufgefallen (habe ja selber so'ne Library programmiert ;-)
![]() 1.) TBigInt.Trim; sollte umbenannt werden in TBIgInt.Normalize; 2.) Ein TBigInt der 0 ist wird bei dir mit FDigit[0] := 0; initialisiert. Das führt dazu das Length(FDigit) = 1 ist. Du solltest die 0 intern mit FDigit = nil = Lenght(FDigit) = 0 definieren. Das vereinfacht alle nachfolgenden Operationen. TBigInt.IsZero := FDigits = nil; 3.) Es ist clever FDigits in Schritten von zb. 16 TDigits zu erhöhen. Parallel dazu ein neues Feld FCount das die Anzahl der real benutzten TDIgits in FDigits speichert. So verhindert du die vielen Reallokationen des dynam. Arrays FDigits. Das bringt ne ganze Menge mehr Performance 4.) Deine Konvertierungsfunktionen eines TBigInt von/nach String zu einer beliebigen Basis sind ineffizient Das geht bei weitem schneller, bzw. dein Algorithmus ist ineffizient. 5.) Die ganzen Funktionen wie .IsGreater, .IsEqual usw. sind überflüssig. Das ist "Programmiererdenken" und nicht Denken eines Mathematikers. In meiner Lib gibts nur eine Funktion .NCmp(A, B): Integer; vergleiche A mit B und gebe -1 zurück wenn A < B, +1 wenn A > B und 0 wenn A = B. 6.) Zur Überprüfung einer Zahl auf Prime gibt es bessere Algos. als Rabin Miller. Zb. Test nach Selfridge-Wagstaff-Pomerance. 7.) Add() und Sub() sind die gleiche Operation nur mit inversen Vorzeichen, warum zwei getrennte Funktionen 8.) Warum subtrahisert du im 2'Complement, die vorherige Konvertierung macht deine Sub/Add unnötig langsam. 9.) die Funktionen für Add()/Sub()/Mul() etc. sollten in Assembler codiert werden. Besonders weil du als Basis 2^32 benutzt. Das hat primär nichts mit Peformance zu tuen, sondern als erstes mit der Fähigkeit in Assembler die speziellen Features der CPU besser benutzen zu können. Dh. in Assembler haben wir Möglichkeiten die Opcode für ADD/SUB/MUL/DIV chained zu benutzen. Deine jetzge Konvertierung und Rechnung mit Int64 macht deine Funktionen mindestens 3 mal so langsame wie sie sei könnten. Int64 ist in der Delphi RTL absolut miserable implementiert, soll heisen ineffizient. Fast alle meiner eigenen Int64 Routinen sind 2-5 mal schneller als die von Borland. 10.) deine Division geht weit besser. Schau mal bei D.Knuth rein, Absatz "Arithmetics". 11.) die Barret Reduction ist im Vergleich zum Montgomery Trick ineffizienter Gruß Hagen |
Re: Eine BigInt Klasse + RSA-Beispiel
Delphi-Quellcode:
Gruß Hagenfunction DoAddC(Digits: Pointer; Value: Cardinal; Count: Integer): Cardinal; asm LEA EAX,[EAX + ECX] NEG ECX ADD [EAX + ECX],EDX MOV EDX, 0 JMP @@2 @@1: ADC [EAX + ECX],EDX @@2: JNC @@3 INC ECX JNZ @@1 @@3: ADC EDX,EDX MOV EAX,EDX end; procedure TBigInt.Add(Value: Cardinal); var Carry: Cardinal; begin Carry := DoAddC(@FDigits, Value, Length(FDigits)); if Carry <> 0 then begin SetLength(FDigits, Length(FDigits) +1); FDigits[High(FDigits)] := Carry; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 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