Autor Beitrag
ceza
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 15.04.12 20:24 
Ich habe ein Problem. Und zwar schreibe ich grad ein Programm, dass die Inhaltskette von einer Anfangszahl berechnen soll.
Inhaltskette: zbsp. begonnen bei 12:
-> Teilersumme(12)=1+2+3+4+6 = 16
-> Teilersumme(16) = 1+2+4+8 = 15
-> Teilersumme(15) = 1+3+5 = 9
-> Teilersumme(9) = 1+3 = 4
-> Teilersumme(4) = 1+2 = 3
-> Teilersumme(3) = 1 = 1
Die Inhaltskette von 12 ist demnach: 12, 16, 15, 9, 4, 3, 1.
Das hat auch mit Perfekten/vollkommenen Zahlen (zbsp. 6) zu tun. oder befreundeten Zahlen und so, aber das interessiert mich erstmal nicht...
Mein Problem ist einfach, dass zum Beispiel bei der Inhaltskette von 276 Zahlen vorkommen, die so viele Stellen haben, mit denen das Programm nicht mehr fertig wird.
Er gibt zwar ein Ergebnis aus, dieses ist aber falsch.
Jetzt habe ich im Internet gesucht, aber finde zbsp. zur LangZahlArithmetik nur eigenständige Programme und schaffe es nicht, diese in mein Programm zu integrieren.
Mein Programm rechnet nämlich noch mit Int Zahlen und das möchte ich ändern, aber wie?
Außerdem habe ich auch im Internet nach ähnlichen Programmen gesucht, aber dort finde ich nur Sachen zu den Themen, die ich mich erstmal nicht interessieren (s.o.)...

bisher habe ich:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.Button1Click(Sender: TObject);
Var  s               : String;
     y,z,k,b,a,r     : Integer;
begin
  s:=Edit1.Text;
  z:=StrToInt(Edit2.Text);
  Memo1.Clear;
  Memo1.Lines.Add('0:  '+s);
  y:=0;
  a:=StrToInt(s);
  While ( (a > 1AND (y < z) ) do
    Begin
      y:=y+1;
      r:=0;
      b:=ROUND(SQRT(a));
      For k:=2 to b do
        If (a MOD k) = 0 Then
          r:=r+k+(a DIV k);
      If Trunc(SQRT(a)) = SQRT(a) Then
        r:=r-Trunc(SQRT(a));
      r:=r+1;
      Memo1.Lines.Add(IntToStr(y)+':  '+IntToStr(r));
      If a = r Then
        y:=z;
      a:=r;
    end;
end;


Dann zeigt er mir aber zum Beispiel bei der Zahl 32112 folgendes als Lösung:

0: 32112
1: 58160
...
50: 5833
51: 327
52: 113
53: 1

Er kommt auf ein richtiges Ergebnis und endet.
Aber zum Beispiel bei 276 ist das Ergebnis falsch, weil während der Berechnung die Zahlen zu groß werden.

Meine Frage nun ist, wie ich LangZahlArithmetik einbauen kann, oder was ich noch für andere Möglichkeiten habe...
Hoffentlich kann mir einer von euch weiterhelfen!! Ich danke euch schon vielmals im Voraus und entschuldige mich für diesen langen Beitrag!!

Greets
CeZa
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2623
Erhaltene Danke: 1452

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 16.04.12 09:26 
Hallo Ceza,
Deine Inhaltsketten, in der Literatur auch Teilersummenfolgen genannt, gehören zu den offenen Fragen der Mathematik.
Mit einem Startwert 276 wirst Du kaum zu einem Ergebnis kommen, da dieser Wert zu den sogenannten Lehmer-Five (im Internet suchen!) gehört und seit Jahren von vielen Mathematikern mit speziellen Algorithmen getestet wird.
Gegenwärtig dürfte das größte bekannte Glied mehr als 133 Stellen haben und somit eine Menge Probleme bei der Teilerbestimmung erzeugen.
Schon das 500.Glied der 276-Folge ist 39448887705043893375102470161238803295318090278129552. Diese Zahl hat die Primteiler 2^4·7·11·131·113809·6418487591·334613490016652615534207006494649. Die Primzahl 6418487591 zu finden und 334613490016652615534207006494649 als prim nachzuweisen, ist mit einfachen Mitteln nicht möglich.

Zahlen mit mehr als 40 Stellen zu faktorisieren, ist mit Probedivision nicht mehr machbar. Dafür brauchst Du Verfahren über elliptische Kurven oder quadratische Siebe. Ohne Dir die Freude nehmen zu wollen, muss ich Dir sagen, dass derartige Methoden kompliziert sind und bisher nur selten als Programme umgesetzt wurden. Unter sourceforge.net/projects/msieve/ wird ein C-Code angegeben, der dies realisiert, meiner Meinung nach aber extrem anspruchsvoll ist.

Zur Langarithmetik: Unter www.submanifold.be/triade/GInt/gint.html findest Du ein Package, dass sehr gut die Rechnung mit langen Integerzahlen ermöglicht.

Beste Grüße
Mathematiker
ceza Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 16.04.12 14:28 
Hey Mathematiker,

erstmal vielen Dank für die Antwort.
Und: Ja, das wusste ich schon ;) Das die zbps. 276 noch nicht zu ende berechnet ist und man nicht weiß wo, wie oder wann sie enden wird...
Ich versteh auch was du meinst. Mein Programm probiert es halt nur aus. Was bei mehrstelligen Zahlen immer schwieriger wird.
Ich hatte auch nicht vor mit diesem Programm die Probleme der Mathematik zu lösen ;)
Ich wollte nur eine Möglichkeit haben mit Zahlen mit mehr als 10 Stellen zu rechnen und zu arbeiten...
Vielleicht hilft mir das auch bei späteren Projekten oder Ähnlichem.
Ich danke dir vielmals für die Antwort.
Ich werde mich mal in deine Vorschläge einarbeiten.

greets
CeZa