Entwickler-Ecke

Open Source Projekte - große Fibonaccizahlen


Fiete - Mo 24.07.23 16:31
Titel: große Fibonaccizahlen
Moin,
das Programm berechnet die N-te Fibonaccizahl, N=1 bis 999999.
Fibo999999
Die Langzahlunit enthält die folgenden Methoden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type TFeld=Array of Int64;

 // IntegerVariable B umwandeln in ein Array vom Typ TFeld
 procedure LangInt(var A:TFeld;B:Integer);
 function LangKleiner(A,B:TFeld):Boolean; // A<B ?
 function LangGleich(A,B:TFeld):Boolean;  // A=B ?
 procedure LangRead(Zahl:String;var Z:TFeld); // Zahl eingeben
 procedure LangIntToStr(Zahl:TFeld;var Erg:String); // Liste --> String wandeln
 procedure LangAdd(var S:TFeld;A,B:TFeld);  // A+B
 procedure LangSub(var D:TFeld;A,B:TFeld);  // A-B
 procedure LangMul(var E:TFeld;A,B:TFeld);  // A*B
 procedure LangDivision(var E,R:TFeld;A,B:TFeld);
 procedure LangAusgabe(LMemo:TMemo;S:TFeld); // Ergebnis ausgeben
 procedure LangSqrt(var XA:TFeld;A:TFeld); // W=trunc(sqrt(A))
 procedure LangPotenz(var E:TFeld;B:TFeld;Expo:Cardinal); // E=B^Exponent

Viel Spaß beim Testen!

Gruß Fiete


jaenicke - Mo 14.08.23 01:22

Das funktioniert sehr gut. :zustimm:

Wie wäre es, wenn du die Langzahlarithmetik als "echten" Zahlentyp umsetzt? (Quelltext siehe Anhang)

Dann sieht das nämlich statt so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  A1, A2, Summe: TFeld;
...
   LangInt(A1,0);LangInt(A2,1);
   if N>1 then LangInt(Summe,1else LangInt(Summe,0);
   for K:=3 to N do
    begin
     A1:=A2;A2:=Summe;
     LangAdd(Summe,A1,A2);
    end;


So aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
  A1, A2, Summe: TVeryLongInt;
...
  A1 := 0;
  A2 := 1;
  if N>1 then
    Summe := 1
  else
    Summe := 0;
  for K:=3 to N do
  begin
    A1 := A2;
    A2 := Summe;
    Summe := A1 + A2;
  end;


Fiete - Mo 14.08.23 17:11

Moin jaenicke,

habe versucht den Quelltext mit D6pro zu compilieren, leider fehlgeschlagen.

Meldung vom Compiler:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
[Fehler] LangZahlRechnenInt64_2.pas(11): 'END' erwartet, aber 'CLASS' gefunden
[Fehler] LangZahlRechnenInt64_2.pas(11): ';' erwartet, aber '(' gefunden
[Fehler] LangZahlRechnenInt64_2.pas(11): ';' erwartet, aber ')' gefunden
[Fehler] LangZahlRechnenInt64_2.pas(11): '=' erwartet, aber ';' gefunden
[Fehler] LangZahlRechnenInt64_2.pas(12): PROCEDURE oder FUNCTION erwartet
[Fehler] LangZahlRechnenInt64_2.pas(30): 'IMPLEMENTATION' erwartet, aber ';' gefunden
[Fehler] LangZahlRechnenInt64_2.pas(42): ';' erwartet, aber 'IMPLEMENTATION' gefunden
[Fataler Fehler] FiboLang.pas(7): Verwendete Unit 'LangZahlRechnenInt64_2.pas' kann nicht compiliert werden


Gruß Fiete


jaenicke - Mo 14.08.23 18:40

Stimmt, das geht erst ab Delphi 2006. Ich habe nicht darüber nachgedacht und nicht nachgeschaut, welche Version du verwendest.

Mit der kostenlosen Community Edition funktioniert es aber.


Fiete - Di 15.08.23 15:08

Moin Sebastian,
in meinem Archiv habe ich noch eine Formel zur Berechnung der N-ten Fibonacci-Zahl gefunden.
FiboFormel
der Delphiquelltext dazu:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var Erg,W5,Nenner:Extended;
 begin
  N:=Eingabe.Value;
  inc(N);
  W5:=sqrt(5);Nenner:=W5*Power(2,N);
  Erg:=(power(1+W5,N)-power(1-W5,N))/Nenner;
  Ausgabe.Items.Add(Format('%0.0f',[Erg]));
 end;

Mir fehlt jetzt die Kenntnis wie ich die Zeilen auf beliebig große RealZahlen erweitere.

Vielleicht hast Du eine Idee.

Gruß Fiete


jaenicke - Mi 16.08.23 07:27

Für die Formel von Moivre-Binet wirst du analog zu deinen Langzahlen eine Berechnungsmöglichkeit mit der entsprechenden Präzision benötigen. Das gibt es alles fertig, z.B. hier:
https://github.com/rvelthuis/DelphiBigNumbers
Allerdings funktionieren diese Bibliotheken wohl alle nicht mit Delphi 6. Diese funktioniert z.B. ab XE2.