AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unbegrenzt viele Nachkommastellen

Ein Thema von c113plpbr · begonnen am 8. Dez 2003 · letzter Beitrag vom 9. Aug 2011
Antwort Antwort
Seite 7 von 12   « Erste     567 89     Letzte »    
Benutzerbild von Dano
Dano

Registriert seit: 12. Aug 2004
49 Beiträge
 
#61

Re: Unbegrenzt viele Nachkommastellen

  Alt 28. Aug 2004, 02:36
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

genauso wie dein DEC

naja...
mfg
Dano

P.S: nailor, das war nicht nett
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#62

Re: Unbegrenzt viele Nachkommastellen

  Alt 28. Aug 2004, 11:30
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!
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Dano
Dano

Registriert seit: 12. Aug 2004
49 Beiträge
 
#63

Re: Unbegrenzt viele Nachkommastellen

  Alt 23. Sep 2004, 01:29
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
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#64

Re: Unbegrenzt viele Nachkommastellen

  Alt 23. Sep 2004, 13:44
Zitat:
die funktion NRnd liefert aber immer zahlen die ähnlich sind
Kannst du genauer sagen was du unter "ähnlich" verstehst ?
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
  Mit Zitat antworten Zitat
Benutzerbild von Dano
Dano

Registriert seit: 12. Aug 2004
49 Beiträge
 
#65

Re: Unbegrenzt viele Nachkommastellen

  Alt 24. Sep 2004, 00:22
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:
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;
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?


mfg
Dano

PS: dein IInteger ist echt klasse
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#66

Re: Unbegrenzt viele Nachkommastellen

  Alt 24. Sep 2004, 12:50
NRnd(var A: IInteger; Bits: Integer = 0; Sign: Boolean = False; Random: TRandom = nil); overload; Bits gibt dabei die Größe=Wertebereich des IInteger's in A an der erzeugt werden soll.
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:
  NRnd(A, -32);
  NMod(A, 1000000 - 100000);
  NAdd(A, 100000);
Gruß Hagen


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;
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#67

Re: Unbegrenzt viele Nachkommastellen

  Alt 24. Sep 2004, 13:12
Zitat:
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?
Ja selbstverständlich Per Default ist RND vom Klassentyp TRandom_LFSR mit 2^128-1 Bits Periode. Delphis Random() ist dagegen nur ein LCG = Linear Congruental Generator mit maximal 2^32-1 Bits Periode.
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
Angehängte Dateien
Dateityp: pas mng.pas (7,5 KB, 66x aufgerufen)
Dateityp: pas lng.pas (6,1 KB, 55x aufgerufen)
Dateityp: pas isaacrng.pas (6,6 KB, 49x aufgerufen)
Dateityp: pas bng.pas (16,6 KB, 50x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Dano
Dano

Registriert seit: 12. Aug 2004
49 Beiträge
 
#68

Re: Unbegrenzt viele Nachkommastellen

  Alt 2. Okt 2004, 19:49
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
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#69

Re: Unbegrenzt viele Nachkommastellen

  Alt 5. Okt 2004, 02:24
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
  Mit Zitat antworten Zitat
Benutzerbild von Dano
Dano

Registriert seit: 12. Aug 2004
49 Beiträge
 
#70

Re: Unbegrenzt viele Nachkommastellen

  Alt 9. Okt 2004, 02:02
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:
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.
also button und memo ist klar.... also brauchst nur den button-event + die format-const kopieren

Zitat:
33-(21)te Wurzel ---------
0. Zahl : 5EC275847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D 0F808AE024E781

1. Ergebnis : D1
1. Rest : C65A03E5049A58BE0EB105020E815EFEFA99A0E3A4D3FD449A D2490E18728F
1. Prüfung : 51F1890A395EC0F891CC6914EC61F25E4BAA985176F3B502C8 FF97535AC61D60

2. Ergebnis : D1
2. Rest : D97467E283B422122DBCE14FEA26ACAACC58BF2AA0F993408A ABB8093773CB0
2. Prüfung : 5EC275847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D 0F808AE024E781


81-(51)te Wurzel ---------
0. Zahl : 5EC275847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D 0F808AE024E781

1. Ergebniss : 8
1. Rest : 1F75847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D0F 808AE024E781
1. Prüfung : 2775847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D0F 808AE024E781

2. Ergebniss : 8
2. Rest : 5EBA75847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D 0F808AE024E781
2. Prüfung : 5EC275847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D 0F808AE024E781


255-(FF)te Wurzel ---------
0. Zahl : 5EC275847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D 0F808AE024E781

1. Ergebniss : 1
1. Rest : 18
1. Prüfung : 19

2. Ergebniss : 1
2. Rest : 5EC275847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D 0F808AE024E780
2. Prüfung : 5EC275847C9568C0F6998624E8F5DBC9F9758AA33D5E7A398D 0F808AE024E781
und das sind mal 3 beispiele wo es nicht klappt

ich hoffe das dir das hilft

mfg Dano

ps: im memo habe ich Courier als font.... das machts übersichtlicher
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 12   « Erste     567 89     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr.
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