![]() |
BigInt: RandomRange Funktion?
Ich hab mir
![]() MfG Z4ppy |
Re: BigInt: RandomRange Funktion?
*push*
MfG Z4ppy |
Re: BigInt: RandomRange Funktion?
Hallo.
In der Math.pas ist RandomRange definiert mit:
Delphi-Quellcode:
Du brauchst also ein Random(), das mit BigInt funktioniert.
function RandomRange(const AFrom, ATo: Integer): Integer;
begin if AFrom > ATo then Result := Random(AFrom - ATo) + ATo else Result := Random(ATo - AFrom) + AFrom; end; Leider enthält die BigInt.pas keine Random-Routine. Eine ![]() ![]() Wenn du auf BigNum2 umsteigst, müsstest du eine Random()-Routine dabei haben. Wenn es unbedingt BigInt sein muss, könntest du irgendwie das normale "Random(): Integer" so oft kopieren, sodass der BigInteger möglichst voll ausgenutzt wird. Das halte ich aber für etwas umständlich und unprofessionell. Folgender Code (der im Moment nicht funktioniert) als Denkanstoß:
Delphi-Quellcode:
Dann müsstest du eben schauen, wie oft der Integer maximal in den BigInteger "reinpasst" (unter der Annahme, dass Random() stets den höchste Integer-Wert annimmt). Ich würde das mit einer For-Schleife, wie oben gezeigt, machen.
function BigRandom(): TBigInt;
var i: integer; bg: TBigInt; begin bg := TBigInt.Create; for i := 1 to (High(bg) div High(Integer)) do begin bg.Add(Random(High(Integer)); end; result := bg; end; Gruß blackdrake |
Re: BigInt: RandomRange Funktion?
Dummerweise sind die Zufallszahlen, die du mit der zweiten Methode erhältst, nicht gleich- sondern (annährend) normalverteilt.
|
Re: BigInt: RandomRange Funktion?
Zitat:
![]() // Edit: Mein oben genannter Code ohne obere Grenze kann gar nicht funktionieren, da TBigInt theoretisch unendlich große Werte verwalten kann, also High(BigInteger) = unendlich. Gruß blackdrake |
Re: BigInt: RandomRange Funktion?
Dummerweise arbeite ich mit Verschlüsselungen :D
Zum verlinkten Thema: Leider scheint in dieser Unit auch keine Random-Funktion enthalten zu sein :( Gibts denn irgendwie "bessere" Random-Funktionen als die der Math-Unit? MfG Z4ppy |
Re: BigInt: RandomRange Funktion?
Zitat:
![]() |
Re: BigInt: RandomRange Funktion?
Die Windows-Crypto-API bietet die Funktion CryptGenRandom. Wenn du dir damit eine gewisse Anzahl zufälliger Bytes holst, hast du eine gleichverteilte Zufallszahl. Der einzige Nachteil ist, dass der Umfang deines Zahlenraums von der Form 2^n sein muss.
|
Re: BigInt: RandomRange Funktion?
Das macht doch nix - aus den Bytes erstellt man eine BigInt-Instanz und nimmt Min(candidate, max) ;)
|
Re: BigInt: RandomRange Funktion?
Das hat dann aber wirklich nichts mehr mit Gleichverteilung zu tun.
|
Re: BigInt: RandomRange Funktion?
@Meflin: Schaut ja eigentlich ganz gut aus, is aber glaube ich ein bisschen zu viel des Guten (ohne Blick auf die Source, kb aufs Reggen :D)
MfG Z4ppy |
Re: BigInt: RandomRange Funktion?
Es gibt eine schnellere (mit sehr kleiner Bias) und eine etwas langsamere Methode, die allerdings Gleichverteilung erzeugt. Der Einfachheit sollen bigints zwischen 0 und R-1 erzeigt werden. Wenn R n bits braucht, erzeugst Du ein bigint x mit n random bits.
Methode 1: random = x mod R (wie gesagt hier hast Du eine kleine Störung der Gleichverteilung, die allerdings umso kleiner ist, als R größer wird) Methode 2:
Code:
Als einfachen cryptografischen Generator kannst Du
repeat
x = n random bits until x<R; random = x; ![]() ![]() Gammatester |
Re: BigInt: RandomRange Funktion?
THX, allerdings muss ich zugeben, dass ich mit dieser Unit net ganz klarkomm :oops:
Was bedeutet denn dieses ctx in jeder Prozedur/Funktion? Wie generiert man dort nun eine Zufallszahl zwischen 1 und x? MfG Z4ppy €dit: Ich glaub, ich werd des random = x mod R machen, denn ich hab ohnehin riesige Primzahlen (1000 bis 20000 stellig :D) in meinem Programm ;) Von denen kann ich dann halt n R berechnen... Was sollte man denn als x nehmen? |
Re: BigInt: RandomRange Funktion?
Zitat:
Welche Funktionen Du verwenden kannst, hängt von den biginst ab. Wenn's ein array of cardinal ist, etwa isaac_read(ctx, @DeinArray, length(DeinArray)*sizeof(cardinal)). Zitat:
Gammatester |
Re: BigInt: RandomRange Funktion?
Danke für deine Erklärung, muss aber gleich weg, werds mir daher später ansehen...
Ich meinte: Was muss x sein ;) Eine beliebige, möglichst grosse Zahl? MfG Z4ppy |
Re: BigInt: RandomRange Funktion?
Nun nochmal: ich nehme random:=x mod R, R ist eine riesige Zahl - was muss x sein?
MfG Z4ppy |
Re: BigInt: RandomRange Funktion?
Zitat:
R ist eine riesige Zahl und Du sucht eine Zufallszahl z mit 0 <= z < R. Sei l = ceil(log2(R)) die Bitlänge von R. Die bessere Methode:
Code:
Mit der mod-Methode erzeugst Du l+k BITS, machst aus diesen BITS ein bigint x und setzt z := x mod R.
repeat
erzeuge l Zufalls-BITS mach aus den l BITS ein bigint x >=0 until x < R z := x; Je größer k ist, desto bessere Gleichverteilung erhältst Du. Also zB k=32: Abweichung von der Gleichverteilung ca 1 : 4 Milliarden. Gruß Gammatester |
Re: BigInt: RandomRange Funktion?
Und wie erzeugt man nun ein Zufallsbit? Und wie macht man daraus ein BigInt?!
MfG Z4ppy |
Re: BigInt: RandomRange Funktion?
Zitat:
![]() Wenn Du konkreten Code sehen willst, kannst Du ihn in meinem MPArith-Archiv (gleiche URL wie Beitrag #12) finden, ich werde mir jedenfalls keinen Code für die im Beitrag #1 genannte bigint-Klasse antun. Gruß Gammatester |
Re: BigInt: RandomRange Funktion?
Hmm, mir is grad noch ne ganz einfache methode eingefallen :D
Man generiert quasi einfach einen Zufallsstring aus Ziffern... Man muss die Zufallszahl natürlich in einer Variable zwischenspeichern, um sicher zu gehen, dass die Zahl mit Zufügen der Ziffer net grösser wird, als R... Am Schluss kann man den String ja dann einfach in nen BigInt umwandeln... Werde das morgen mal testen, müsste aber eigentlich funktionieren... MfG Z4ppy |
Re: BigInt: RandomRange Funktion?
Zitat:
Zitat:
|
Re: BigInt: RandomRange Funktion?
Ich dachte eigentlich an Dezimalziffern ;) Also str:=str+inttostr(RandomRange(0,9)); wobei die erste Ziffer keine 0 sein sollte...
MfG Z4ppy PS.: KP, ob die Syntax da oben jetz stimmt, sollte aber scho richtig sein... Und den String kann man dann ja mit TBigInt.Create(str); umwandeln... |
Re: BigInt: RandomRange Funktion?
Zitat:
1. Sind wir wieder beim Thema, daß RandomRange für kryptographische Anwendungen viel zu unsicher ist. 2. Wenn Du wirklich 20000-stellige Primzahlen mit der Methode erzeugen willst (das sind mehr als 66000 Bits, wenn "Stelle" wieder Dezimal bedeutet), wirst Du viel Zeit für andere Sachen haben. Versuch's erstmal mit 2048 Bits oder 1000 Dezimalstellen. Auf jedenfall ist es besser mit den Arrayelementen zu arbeiten. Schau mal in das Testprogram der von Dir benutzten Klasse aus #1, dort wird genau das gemacht:
Delphi-Quellcode:
Jetzt brauchtst Du eigentlich nur noch random durch was kryptographisch Besseres zu ersetzen, zB mit dem ISAAC:
p := TBigInt.Create(0);
for i:=0 to CRYPTO_DIGITS do p.Digit[i] := random($FFFFFFFF); p.Digit[0] := p.Digit[0] or 1;
Delphi-Quellcode:
Gruß Gammatester
p := TBigInt.Create(0);
for i:=0 to CRYPTO_DIGITS do begin isaac_next(ctx); p.Digit[i] := LongWord(ctx.nextres); end; p.Digit[0] := p.Digit[0] or 1; |
Re: BigInt: RandomRange Funktion?
Ich glaub, du hast mich net verstanden ;) Ich HABE Primzahlen bis 20k Stellen und will nun eine beliebige (natürliche) Zahl mit 1<x<p erzeugen, wobei p die 20k-stellige Zahl ist. Ich rede hier übrigens immer von Dezimalstellen...
Das mitm ISAAC werd ich mir nachher nochma ansehen ;) MfG Z4ppy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 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