![]() |
Re: Unbegrenzt viele Nachkommastellen
sorry.... das mit dem ordentlich war nicht so gemeint daß deine NInts nicht ordentlich ist....
aber sinus und cosinus... ist ja extra(NInt_1.dcu)... ich dachte da mehr an ein 'all in one'... das ich nur eine lib/package includen muß und alles da ist... den aufwand kenn ich.... deshalb frag ich ja ob du so lieb bist eine lib online zu stellen...natürlich mit deine copyrights... weil so versuchen jeden tag 100 noobs wie ich selber sowas zu machen (rechnen mit endlos langen zahlen)... und das will nicht so recht klappen... und da sowas bei delphi irgendwie ein großes schwarzes loch ist(nichtmal borland bietet sowas als zusatz an) und in c/c++ gibts mehrere libs, wäre es schön gewesen wenn es geklappt hätte... das was du netterweiße zum download gegeben hast ist leider igendwie nur in mehreren stücken... besser wer ein include und ne anleitung für leute wie mich die nicht so erfahren sind in delphie... so nach dem motto "DECMath in uses eintragen, dann habt ihr IInteger, und ihr könnt damit das, das, das machen" opencource muß es ja nicht unbedingt sein, ich würde es sowieso nicht verstehn^^.... hauptsache es funktionier... und wenn es jemand comerziel nutzen will... muß er es natürlich bezahlen, und wenn du selber schon sagst das selbst gmp nich so gut ist wie dein IInteger, wäre das eigentlich eine marktlücke für dich :-D genauso wie dein DEC naja... mfg Dano P.S: nailor, das war nicht nett |
Re: Unbegrenzt viele Nachkommastellen
Das war in keinster Weise böse oder verunglimpfend gemeint. Aber du hast echt sehr viel geschrieben und dann damit geendet, dass du vorraussichtlich in nächster Zukunft nichts neues mehr zu dem Thema programmieren wirst, obwohl du anscheinend noch voll im Thema drin bist und mit so einem Post den besten Grundstein zu einer Weiterentwicklung gelegt hast.
Falls das jetzt von dir und/oder auch anderen als Angriff oder so gewertet wurde, will ich betonen dass das nicht meine Intention war und mich für die Aufregung entschuldigen, die ich verursacht habe. Und jetzt: Viel Spass beim weiterposten! :dp: |
Re: Unbegrenzt viele Nachkommastellen
hi Hagen
ich habe mal bissel gebastelt^^ und brauche zufallszahlen die funktion NRnd liefert aber immer zahlen die ähnlich sind :( man kann der funktion noch ein TRandom übergeben.... aber was ist das und wie benutze ich das? oder wie kann ich am besten echt gute zufallszahlen bei IInteger erstellen? mfg Dano |
Re: Unbegrenzt viele Nachkommastellen
Zitat:
Meinst du das nach dem Start der Anwendung immer wieder mit den gleichen Zahlen begonnen wird ? Oder meinst du das die Zahlen alle im gleichen Wertebereich liegen, zB. eben immer 512 Bits -> 2^512 <= x < 2^513 liegen ? Über den Parameter vom Typ TRandom kannst du deinen eigenen Zufallsgenerator übergeben. Sei es ein komplett anderer Zufallsgenerator oder nur eine eigene Instanz, sprich eigene Kopie mit eigenen Initialisierungsparamatern. Aber normalerweise sollte der RNG vom DEC, ein LFSR mit maximaler Periode von 2^2048, vollkommen ausreichend und sicher sein. Wird einer Funktion die eine TRandom-Instance benötigt stattdessen NIL übergeben so wird diese Funktion intern den RND aus der Unit RNG.pas benutzen. Wie bei jedem Pseudozufalls-Generator gibt es immer zwei Dinge zu beachten: 1.) die Periode und Komplexität bestimmt die kryptographische Sicherheit des Algos. TRandm_LFSR im DEC ist ein sehr sicherer LFSR da er intern mit mindestens 128 Bit Registerbreite arbeitet. 2.) jeder PRNG muß initialisiert werden und diese Initialisierung bestimmt dann welche Zufallsbits erzeugt werden. D.h. das Seed-Register des RNGs bestimmt was für Bits -> IInteger-Zahlen, erzeugt werden. Wird also dieses Seedregister immer auf den gleichen Wert initialisiert so MÜSSEN durch diesen RNG die selben Zahlen erzeugt werden. Um immer unterschiedliche Zahlen zu erzeugen muß man dieses Seed Register also beim Start der Anwendung mit anderen Werten füllen, wie beim Delphi Random() mit Randomioze() möglich. Nun, aber diese Initialisierung ist der kryptograühisch kritischste Moment. Werden schlechte Werte dafür benutzt, sprich sind diese reproduzierbare Werte, so ist der komplette Output dieses Generators als unsicher einzustufen !! Andererseits ist es für mathematische/statistische Berechnungen absolut wichtig das ein RNG immer wieder reproduzierbare Zufallswerte erzeugt. Demzufolge darf eine beliebige Random-Bibliothek niemals einen Zufallsgenerator mit igendwelchen Werten initialisieren, dies muß immer Aufgabe des Programmierers und Nutzers dieser Library durchführen. Also DU ;) Gruß Hagen |
Re: Unbegrenzt viele Nachkommastellen
hi Hagen,
jup, mit ähnlich meinte ich das die zahlen immer zwischen einer 2er potenz sind also bei NRnd(Zahl,16); sind sie immer zwischen 32 000 und 65 000.... die zufallszahlen haben nichts mit verschlüsselung zu tun, sind nur für mathematische versuche ;) habe aber einen weg gefunden :) ich lösche einfach das erste bit in der IInteger mit NCut dann kommen ganz gute ergebnisse^^ hier mal ein beispiel: ein memo und ein button auf form1 und los gehts^^
Delphi-Quellcode:
und wenn ich das richtig verstanden habe brauche ich NRnd kein TRandom übergeben weil er dann automatisch das TRandom aus der RNG.Pas benutzt und das reicht für gute zufallszahlen?
procedure TForm1.Button1Click(Sender: TObject);
var Zahl,ZahlMin,ZahlMax: IInteger; Count,Bits: Integer; begin Bits:=16; NSet(ZahlMax,NNull); NRnd(ZahlMin,Bits); for Count:=1 to 100 do begin NRnd(Zahl,Bits); NCut(Zahl,Bits-1); if NCmp(Zahl,ZahlMax)= 1 then NSet(ZahlMax,Zahl) else if NCmp(Zahl,ZahlMin)= -1 then NSet(ZahlMin,Zahl); Memo1.Lines.Add(NStr(Zahl,10)); end; Memo1.Lines.Add('------------------------'); Memo1.Lines.Add('Kleinste: '+NStr(ZahlMin,10)); Memo1.Lines.Add('Größte: '+NStr(ZahlMax,10)); end; mfg Dano PS: dein IInteger ist echt klasse :) |
Re: Unbegrenzt viele Nachkommastellen
Delphi-Quellcode:
Bits gibt dabei die Größe=Wertebereich des IInteger's in A an der erzeugt werden soll.
NRnd(var A: IInteger; Bits: Integer = 0; Sign: Boolean = False; Random: TRandom = nil); overload;
Also bei NRnd(A, 64); wird A im Bereich von 2^63 <= A < 2^64 sein, ergo A hat garantiert eine Größe von 64 Bits. Dieses Verhalten ist bei der Anwendung von großen Zahlen, sei es für Kryptographie, Mathematik ect. pp. am häufigsten erwünscht. Meistens muß man eben Zufallszahlen erzeugen (zb. Primzahlen) die exakt X Bits groß sind. Wird Sign == TRUE gesetzt so wird auch das Vorzeichen per Zufall erzeugt, ansonsten bleibt es wie es ist. Du kannst aber auch Bits == 0 übergeben. Dann wird intern Bits per Zufall im Bereich von 1 bis 2048 liegen, d.h. die Function NRnd() erzeugt dann Zufallszahlen im Bereich von 0 <= A < 2^2048 Statt NCut() hättest du dann NBit(A, NHigh(A), False); nehmen können, dies dürfte schneller sein. Wie du am nachfolgendem Source von NRnd() erkennen kannst kann Bits < 0 sein. Zb. mit NRnd(A, -64); würdest du Zahlen im Bereich von 0 <= A < 2^64 erzeugen. Also im Grunde das was du suchtest. Ok, der negative Bits Parameter ist ziemlich versteckt allerdings benötigt man solche Zufallszahlen fast niemals. Zumindestens ich brauchte diese Funktionalität nur ein einzigstes mal bisher. Dein NCut() Aufruf wirkt mathematisch wie ein NMod(A, 2^16), sprich Modulare Division. Falls du Zb. Zahlen im Bereich von 100.000 <= A < 1.000.000 erzeugen wolltest dann sähe dies so aus
Delphi-Quellcode:
Gruß Hagen
NRnd(A, -32);
NMod(A, 1000000 - 100000); NAdd(A, 100000);
Delphi-Quellcode:
procedure NRnd(var A: IInteger; Bits: Integer = 0; Sign: Boolean = False; Random: TRandom = nil);
var I: Integer; begin with NAllocNew(A)^ do begin if Random = nil then Random := RND; if Bits = 0 then Bits := Random.Int(256 * 8); if Bits = 0 then begin FCount := 0; FNeg := False; end else begin if Bits < 0 then begin Bits := -Bits; I := (Bits + 31) shr 5; if Cardinal(I) > FSize then NSetCount(A, I, cfNoFill) else FCount := I; Random.Buffer(FNum^, I * 4); Dec(I); Bits := FNum[I] and ($FFFFFFFF shr (32 - Bits and 31)); FNum[I] := Bits; if Bits = 0 then NNormalize(A); end else repeat I := (Bits + 31) shr 5 +1; if Cardinal(I) > FSize then NSetCount(A, I, cfNoFill) else FCount := I; Random.Buffer(FNum^, I * 4); if FNum[I] = 0 then NNormalize(A); I := NSize(A) - Bits; if I > 0 then NShr(A, I); until I >= 0; if Sign then FNeg := Random.Int(2) = 1; end; end; end; |
Re: Unbegrenzt viele Nachkommastellen
Liste der Anhänge anzeigen (Anzahl: 4)
Zitat:
Die statistischen Eigenschaften der LFSR's = Linear Feadback Shift Register sind bei weitem besser als die der LCG's. Wenn man Zb. eine Monochrome Bitmap per Random() Pixelweise füllt so kann man je nach Seed und Bitmap Dimension eindeutig grafische Muster erkennen, sprich Wiederholungen. Nimmt man dagegen einen LFSR so sieht man immer ein Bild das Weises Rauschen darstellt, also keine Wiederholungen. Es macht ja keinen Sinn eigene TRandom_XXX Klassen im DEC zu integrieren wenn diese nicht wesentlich besser sind als Delphis Random() Funktion. Zudem ist der 128 Bit LFSR ziemlich schnell,auf einem alten PII 266MHz Rechner erzeugt dieser LFSR Zufall mit 40Mb/sec. Ich habe dir aber mal meine alten zusätzlichen TRandom_XXX Klassen rangehangen. Diese basieren NICHT auf IInteger sondern auf TBigNum, meiner vorherigen Klassenbasierten Large Integers. Enthalten sind ein LCG = TRandom_LCG = Linear Congruential Generator der aber im Gegensatz zum Delphi Random() LCG mit viel viel größeren Perioden arbeiten kann. Statt also nur 2^32-1 Bit Periode kannste den mit 2^2048 oder viel viel größerer Periode laufen lassen. Dann der TRandom_MSG = "Micali Schnorr" Generator, dieser basiert auf dem RSA Verfahren und ist ein kryptographisch sicherer RNG wenn man die beiden Primzahlen >= 512 Bit wählt. Bei Primzhalne mit 512 Bit wäre demnach die Periode 2^1024 -1 Bits, und falls man die benutzten Primzahlen und Seeds nicht kennt ist er nicht knackbar -> sprich vorhersehbar. Dann der TRandom_BBS = "Blum Blum Shub" Generator. Das ist der Quadratische Restegenerator und der zur Zeit mathematisch beweiseneermaßen einzigst sichere Zufallsgenerator. Dann der TRandom_ISAAC = der nach dem ISAAC Verfahren arbeitet. So ganz traue ich diesem nicht, allerdings gibt es viele vergleichbare Impelementierungenin anderen Programmiersprachen, und er wird sehr oft verwendet. Um also zu diesen anderen Libraries kompatibel zu sein. Natürlich müsstest du die TBigNums durch IInteger ersetzen, das habe ich bisher nicht gemacht. Gruß Hagen PS: und danke für's Kompliment ;) |
Re: Unbegrenzt viele Nachkommastellen
Hi Hagen
danke,danke,danke :) ich hab jetzt ne lösung mit der ich gut zurecht komme ;) also danke ich dir für deine hilfe :) nun hätte ich noch eine andere frage function NRoot(var A,R: IInteger; const B: IInteger; E: Integer): Boolean; overload; // 1.) was ist R? wenn das der Rest sein soll, dann stimmt irgend etwas nicht.... weil er dann bei manchen ergebnissen unfug macht :( mfg Dano |
Re: Unbegrenzt viele Nachkommastellen
Ja, es sollte der Reminader = Rest sein.
Kannst du mir ein oder besser mehrere Beispiele geben wo er Unfug macht ? Das sollte er nämlich nicht und ich zittere schon bei dem Gedanken der Fehlersuche !
Delphi-Quellcode:
function NRoot(var A,R: IInteger; const B: IInteger; E: Integer): Boolean; overload;
A = B^(1/E) R = B - A^E ergo: B = A^E + R Gruß hagen |
Re: Unbegrenzt viele Nachkommastellen
hi Hagen :)
sorry das die antwort so lange warten ließ, aber das RL fordert meine ganze zeit also: ich habe mal fix ein demoprogramm gemacht wo einmal mit function NRoot(var A,R: IInteger; const B: IInteger; E: Integer): Boolean; overload; die wurzel + rest gebildet wird und dann eine gegenrechnung zur prüfung das ist alles was mit "1." im memo erscheint und dann einmal mit function NRoot(var A: IInteger; const B: IInteger; E: Integer): Boolean; overload; wo ich den rest selber bilde indem ich die wurzel wieder potenziere und von ausgangswert subtrahiere und eine gegenrechnung zur prüfung mache das ist "2." im memo
Delphi-Quellcode:
also button und memo ist klar.... also brauchst nur den button-event + die format-const kopieren
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} uses NInts; // unsere eigene formatkonstante.... const NStrFormatTT: TStrFormat = ( Base: 16; Plus: ''; Minus: '-'; Zero: ''; Comma: ','; DigitsPerBlock: 0; BlockSep: ' '; BlockPadding: ' '; DigitsPerLine: 0; LineSep: #13#10; LinePadding: ' '; DigitsChars: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'; FormatChars: ' /\-+;:#~"()[]?_<>!§$%&{}'''#13#10#9; LeftAlign: False; Offset: 0; Precision: 0; ); procedure TForm1.Button1Click(Sender: TObject); var IIWurzel1,IIRest1: IInteger; IIWurzel2,IIRest2: IInteger; IIData,IINewData: IInteger; Bits,Count: Integer; begin Bits:=$ff; //Länge in bits NRnd(IIData,Bits); //Zahl Generieren //schleife um 255 mal die wurzel zu ziehen for Count:=1 to $FF do begin Memo1.Lines.Add(''); Memo1.Lines.Add(''); Memo1.Lines.Add(IntToStr(Count)+'-('+IntToHex(Count,2)+')te Wurzel ---------'); Memo1.Lines.Add('0. Zahl : '+NStr(IIData,NStrFormatTT)); Memo1.Lines.Add(''); // 1. die wurzel ziehen und das ergebnis + rest anzeigen NRoot(IIWurzel1,IIRest1,IIData,Count); Memo1.Lines.Add('1. Ergebnis : '+NStr(IIWurzel1,NStrFormatTT)); Memo1.Lines.Add('1. Rest : '+NStr(IIRest1,NStrFormatTT)); //gegenrechnen..... potenz bilden + rest addieren und anzeigen NPow(IINewData,IIWurzel1,Count); NAdd(IINewData,IIRest1); Memo1.Lines.Add('1. Prüfung : '+NStr(IINewData,NStrFormatTT)); // der 2. lange/andere weg // die wurzel ziehen und das ergebnis + rest anzeigen NRoot(IIWurzel2,IIData,Count); NPow(IINewData,IIWurzel2,Count); NSub(IIRest2,IIData,IINewData); Memo1.Lines.Add(''); Memo1.Lines.Add('2. Ergebnis : '+NStr(IIWurzel2,NStrFormatTT)); Memo1.Lines.Add('2. Rest : '+NStr(IIRest2,NStrFormatTT)); //gegenrechnen..... potenz bilden und rest addieren und anzeigen NPow(IINewData,IIWurzel2,Count); NAdd(IINewData,IIRest2); Memo1.Lines.Add('2. Prüfung : '+NStr(IINewData,NStrFormatTT)); end; end; end. Zitat:
ich hoffe das dir das hilft mfg Dano ps: im memo habe ich Courier als font.... das machts übersichtlicher |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 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