Frage von justinh2407, 80

Zahl mir mehreren Milliarden Nachkommastellen analysieren?

Hallo,
ich würde mal gerne die Zahl Pi (die ersten paar Milliarden Nachkommastellen hab ich schon) "analysieren". Hätte da jemand ein Script oder eine Idee, wie man das unter Linux oder Windows am besten macht? Also zB so: 3,14159265358 das wären dann zwei mal die 1; ein mal die 2; zwei mal die 3 usw. (ich hoffe ich hab mich nicht verzählt ^^)
Lg

Expertenantwort
von Linuxhase, Community-Experte für PC, 26

Hallo

ich würde mal gerne die Zahl Pi [....] "analysieren" [....] Also zB so: 3,14159265358 das wären dann zwei mal die 1; ein mal die 2; zwei mal die 3 usw.

Wenn es nur darum geht zu zählen wie oft eine bestimmte Ziffer darin vorkommt, dann ist das recht einfach:

pi  | sed s'/1/1\n/g' | wc -l

Hab im Moment 4 Milliarden Stellen in ner Textdatei

Du hast eine (Text)-Datei mit vier Milliarden stellen, dann zeig mal:

stat name_der_datei

und

wc -m name_der_datei

Falls Du mehr stellen möchtest, dann rechne mal so:

time echo "scale=5000000000; a(1)*4" | bc -l

Dann hast Du am Ende der Berechnung schon 5 Mrd. Stellen :-)

Linuxhase

Kommentar von hypergerd ,

a(1) {also per atan(1)} per bc zu berechnen, ist eines der langsamsten Wege zur Berechnung der Zahl Pi (könnte zig Monate dauern), da die Berechnungszeit exponentiell ansteigt!

Selbst 10000 Ziffern dauert bei mir schon mehrere 10 min, während y-cruncher.exe 1 Mrd. Ziffern in etwa 4 min berechnet.

Kommentar von Linuxhase ,

@hypergerd

a(1) {also per atan(1)} per bc zu berechnen, ist eines der langsamsten Wege zur Berechnung der Zahl Pi (könnte zig Monate dauern), da die Berechnungszeit exponentiell ansteigt!

Also bei mir hat das:

time echo "scale=50000; a(1)*4" | bc -l

folgende Zeitangaben ausgegeben:

real    127m37.017s
user 127m23.052s
sys 0m4.689s

Ich würde sicher nicht versuchen Millionen oder gar Milliarden zu berechnen. :-)

Selbst 10000 Ziffern dauert bei mir schon mehrere 10 min, während y-cruncher.exe 1 Mrd. Ziffern in etwa 4 min berechnet.

Und das läuft auf Linux ;-)

Linuxhase

Kommentar von hypergerd ,

Was bedeutet "sys"? Also 50000 Stellen unter 5s ?

Nein, habe nicht Linux: ich habe noch das alte von

http://gnuwin32.sourceforge.net/packages/bc.htm

also 32 Bit für Windows.

Gibt es da was schnelleres für 64 Bit?

Abgesehen vom Code ist die Berechnung über die arctan-Reihe sehr langsam. (über 10 Iterationen für 1 Nachkommastelle)

Aber es gibt Algorithmen, die mit 10 Iterationen über 13 Mio. Stellen schaffen -> die würde ich gern damit testen...

Kommentar von Linuxhase ,

@hypergerd

Was bedeutet "sys"?

Das kann ich nicht sagen,aber in der manpage zu time steht:

Total number of CPU-seconds that the process spent in kernel mode.

Die erste Angabe ist die Zeit die es bei mir brauchte, also

2 Stunden, 7 Minuten und 37,017 Sekunden

Aber es gibt Algorithmen, die mit 10 Iterationen über 13 Mio. Stellen schaffen -> die würde ich gern damit testen...

Ich bin kein Mathematiker und kenne mich damit gar nicht aus, aber weiß das der aktuelle Rekord bei 5 Billionen Ziffern hinter dem Komma liegt.

Linuxhase

Kommentar von hypergerd ,

zu "aktuelle Rekord bei 5 Billionen Ziffern..."

Gehörst Du auch zu denen, die meine Antworten ignorieren?

Wie kann ich hier die Ziffernverteilung (Häufigkeit) von 13,3 Bio. anbieten, wenn erst 5 Bio. bekannt sind?

Die 5 Bio. sind aus dem Jahre 2010.

Letzte Rekorde zu Pi sind im Jahre 2014 aufgestellt.

Oder meinst Du "mit Hilfe eines Iterations-Algorithmus"?

Der wurde 2009 per Gauß-Legendre-Algorithmus aufgestellt: 2,57 Bio. Stellen. Nachteil: beinhaltet Wurzeln, die sich schwer (auch wieder iterativ) für über Bio. Stellen berechnen lassen.

Antwort
von hypergerd, 22

Da das jeder Anfänger in jeder Programmiersprache kann {die Rechte auf Datei-LESEN hat}, und es über 1000 Sprachen gibt, könnten hier 1000 Antworten kommen...

Oder geht es Dir nur um das Ergebnis, welches bereits für 13,3 Bio. Stellen gibt:

Dezimal Ziffern 0 bis 9:

{1329997901677,1330001059130,1330000382404,1329999763181,1330000846145,1329998570679,1329999089279,1330001115701,1330001592224,1329999679580}

Hex Counts (0...F ): {690338343609,690338806518,690338700343,690337627621,690337826412,690337204361,690338561057,690336491172,690338098324,690339501812,690338035822,690339098646,690337570964,690339405377,690338214532,690337428931}

Die relativ gute Gleichverteilung der Ziffern beginnt schon bei 1000, was der Iterationsrechner im Beispiel 63 zeigt -> Bild 

Spalte aB absolutzahlen; Spalte aC relative Häufigkeit in %

(auf Textkodierung kann man per Button "Pi dezi" 1024 Ziffern laden; alternativ kann man dieses Feld auch per Zwischenablage mit Strg + v mit bis zu 100000 Zeichen füllen -> danach versagen die meisten Browser)

Kommentar von hypergerd ,

Da ich diese Funktion auch häufiger brauche und viele andere Sprachen sehr langsam sind, habe ich per PureBasic eine sehr kleine und schnelle exe erstellt, die z.B. 10 GB Dateien (da ich 16GB habe) komplett in den RAM ließt und dann in weniger als 2 Sekunden das Ergebnis ausgibt. Wenn Du mir eine E-Mail schickst (schau Dir meine Antworten an -> auf der Haupt-Internetseite findet man meine Adresse als Bild), schicke ich sie Dir zu.

Kommentar von hypergerd ,
Antwort
von Hairgott, 32

Kannst du Programmieren?
Dann ist es leicht. Wenn nicht kannst du auf Word mit der sich Funktion nach einer Zahl suchen und es gibt dir an wie oft es die Zahl findet.

Kommentar von justinh2407 ,

Ein paar Basics kann ich schon, auf der Commandline bin ich auch kein absoluter Anfänger :)

Antwort
von Dogukann, 54

Speicherst die Zahl in eine TextDatei, öffnest sie mit Notepad++, gehst auf die Suchfunktion un tippst ein zB. 2 -> Und er sagt dann zB 1000 Ergebnisse.
Gruß

Kommentar von justinh2407 ,

Schafft Notepad++ diese Zahlenmenge?

Kommentar von Dogukann ,

Müsste schon gehen.

Kommentar von Linuxhase ,

@Dogukann

Müsste schon gehen.

Das glaubst Du doch selbst nicht oder - probiers doch mal.

Linuxhase

Kommentar von Dogukann ,

@Linuxhase Man kann ja schließlich auch auf andere Editoren zugreifen. Die Methode klappt aber ;-)

Antwort
von Tschoo, 27

Hallo!

Die "ersten" paar, wieviel milliarden hast'e den?

Diese müssen ja dann bei dir irgendwo abgespeichert sein, als Text/String, einfach durchzählen, Stelle für Stelle bis zum EOF (END of File) oder Ende des Strings (üblicherweise "\0").

for(int i=0;i<EOF(file);i++){
if (character=='1') Eins++;
   else if (character=='0') Null++;
   (usw)
}

Gruß

Kommentar von justinh2407 ,

Hab im Moment 4 Milliarden Stellen in ner Textdatei, vielen Dank :)

Kommentar von maximilianus7 ,

kann ich nicht einfach so stehen lassen: an dem codesplitter ist ziemlich alles falsch. nur als warnung.

Kommentar von Tschoo ,

Was soll daran falsch sein?

Wenn so ziemlich alles falsch ist, könntest du ja wenigstens eine Fehler benennen!!

Oder ordnest du das in deiner Weisheit irgendeiner Programmiersprache zu?

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten