Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Eine BigInt Klasse + RSA-Beispiel (https://www.delphipraxis.net/73917-eine-bigint-klasse-rsa-beispiel.html)

peanut 27. Jul 2006 10:26

Re: Eine BigInt Klasse + RSA-Beispiel
 
Zitat:

Zitat von Flocke
Aber das ist gerade die "nicht so gute" Variante gewesen (sorry Himi).

Was shmia vielleicht hätte etwas hervorheben sollen und was Dax auch schon geschrieben hat: du solltest nie die Methode Free überschreiben sondern immer den Destruktor Destroy, und das mit override - dort gehört dein Aufräumcode hinein.

Ich bin für alle Hinweise dankbar :-D. Ursprünglich waren die Funktionen nicht in einer Klasse, das wurde erst später gemacht - dementsprechend sieht das jetzt auch aus (wie man sieht :zwinker: )...

Die aktualisierte Version ist jetzt online.

Mackhack 3. Sep 2006 01:02

Re: Eine BigInt Klasse + RSA-Beispiel
 
Kann jemand diesen Thread loeschen bitte von mir?

peanut 3. Sep 2006 12:39

Re: Eine BigInt Klasse + RSA-Beispiel
 
Zitat:

Zitat von Mackhack
Kann jemand diesen Thread loeschen bitte von mir?

Wieso löschen, gibt es ein Problem?

Gruß peanut.

Balu der Bär 3. Sep 2006 12:40

Re: Eine BigInt Klasse + RSA-Beispiel
 
Ich denke Mackhack hat sich verschrieben, er meinte nicht den Thread löschen sondern nur seinen Post. ;)

peanut 3. Sep 2006 13:03

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....

Mackhack 3. Sep 2006 18:34

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!

dominikkv 15. Jul 2007 13:21

Re: Eine BigInt Klasse + RSA-Beispiel
 
hmm... wie kann ich eigendlich zu diesem BigInt eine zahl addieren...?

also sowas irgendwie:

Delphi-Quellcode:
  MyBigInt.Add(548);
weil bei der add-methode kann ja nur ein weiterer BigInt übergeben werden...

peanut 15. Jul 2007 14:09

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...

negaH 15. Jul 2007 14:27

Re: Eine BigInt Klasse + RSA-Beispiel
 
Par Sachen sind mir aufgefallen (habe ja selber so'ne Library programmiert ;-) http://www.michael-puff.de/Developer...agen_Reddmann/

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

negaH 15. Jul 2007 14:34

Re: Eine BigInt Klasse + RSA-Beispiel
 
Delphi-Quellcode:

function 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;
Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz