Seite 1 von 1

grafische Darstellung der Zahlen des Collatz-Problems

Verfasst: Samstag 18. Juli 2009, 11:41
von AntagonisT
Ich beschäftige mich seit einer guten Woche mit Python und habe ein kleines Script geschrieben, das die ersten 10000 Zahlen des Collatz-Problems (->wiki) in 3 Dateien im PostScript-Format ausgibt:

Code: Alles auswählen

file = open ("test.ps", "w")
file.write("%!\n%% Collatz\n")
file.close()

file = open ("test_odd.ps", "w")
file.write("%!\n%% Collatz\n")
file.close()

file = open ("test_even.ps", "w")
file.write("%!\n%% Collatz\n")
file.close()

for n in range (1, 10000, 1):
    i = n
    c_odd = 0
    c_even = 0

    while i > 1:
            y = i % 2
            if y == 1:
                    i = 3 * i + 1
                    c_odd = c_odd + 1
            elif y == 0:
                    i = i/2
                    i = int (i)
                    c_even = c_even + 1

    c = c_odd + c_even

    n_ps = n * 0.05
    c_ps = c * 3    
    c_odd_ps = c_odd * 3
    c_even_ps = c_even *3

    file = open ("test.ps", "a")
    file.write ("newpath\n")
    file.write (str (n_ps) + " ")
    file.write (str (c_ps) + " ")
    file.write ("1.5 0 360 arc\nclosepath\nfill\n")
    file.close()

    file = open ("test_odd.ps", "a")
    file.write ("newpath\n")
    file.write (str (n_ps) + " ")
    file.write (str (c_odd_ps) + " ")
    file.write ("1.5 0 360 arc\nclosepath\nfill\n")
    file.close()

    file = open ("test_even.ps", "a")
    file.write ("newpath\n")
    file.write (str (n_ps) + " ")
    file.write (str (c_even_ps) + " ")
    file.write ("1.5 0 360 arc\nclosepath\nfill\n")
    file.close()
   
file = open ("test.ps", "a")
file.write ("showpage")
file.close()

file = open ("test_odd.ps", "a")
file.write ("showpage")
file.close()

file = open ("test_even.ps", "a")
file.write ("showpage")
file.close()
Und so schaut das dann aus, wenn man das Bild etwas mit Photoshop einfärbt und zurechtschneidet (leider in schlechter Qualität):

Bild

schwarz ist die gesamte Schrittlänge, die sich aus der Anzahl der "geraden" (=grün) und "ungeraden" (rot) Schritte zusammensetzt.

Verfasst: Samstag 18. Juli 2009, 11:48
von BlackJack
@AntagonisT: Das ständige öffnen und schliessen von den Dateien ist ein ziemlicher Zeitfresser. Ausserdem bietet es sich an eine Schleife zu verwenden, wenn man dreimal fast den gleichen Block Quelltext hat.

Verfasst: Samstag 18. Juli 2009, 11:50
von AntagonisT
ok, mal schauen, ob ich das kürzer hinkriege.

Verfasst: Samstag 18. Juli 2009, 12:28
von Leonidas

Verfasst: Samstag 18. Juli 2009, 13:02
von AntagonisT
Leonidas hat geschrieben:Uii, hübsche PostScript-Bilder :)

Ein wenig kürzer, viel schneller, besser strukturiert.
danke, hast du das jetzt so schnell umgeschrieben?

Bei mir geht es nur nicht:

Warning (from warnings module):
File "H:/Anwendungen/Python 3.1/xxx.py", line 17
open('test_even.ps', 'w')) as (ps_both, ps_odd, ps_even):
DeprecationWarning: With-statements now directly support multiple context managers
Traceback (most recent call last):
File "H:/Anwendungen/Python 3.1/xxx.py", line 54, in <module>
main()
File "H:/Anwendungen/Python 3.1/xxx.py", line 24, in main
for n in xrange(1, 10000):
NameError: global name 'xrange' is not defined
und ich versteh ihn auch nicht so ganz... :wink:

Verfasst: Samstag 18. Juli 2009, 13:10
von Leonidas
AntagonisT hat geschrieben:danke, hast du das jetzt so schnell umgeschrieben?
Ja.
AntagonisT hat geschrieben:Bei mir geht es nur nicht:
Ach, du nutzt Python 3.1? Dort wurde xrange in range umbenannt.

Verfasst: Samstag 18. Juli 2009, 13:19
von AntagonisT
stimmt, das hatte ich auch schon ausprobiert.

bleibt noch:
Warning (from warnings module):
File "H:/Anwendungen/Phython 3.1/xxx.py", line 17
open('test_even.ps', 'w')) as (ps_both, ps_odd, ps_even):
DeprecationWarning: With-statements now directly support multiple context managers
keine Ahnung, was ein Context-manager macht oder überhaupt ist - aber ich will jetzt auch nicht, daß Du hier alles erklären musst. Ich lern mich noch durch :wink:

Verfasst: Samstag 18. Juli 2009, 20:57
von Leonidas
Das ist nur eine DeprecationWarning. Nimm den import und Aufruf von ``nested`` weg, dann müsste es tun. Ich wusste nicht dass in 3.x das direkt funktioniert - umso besser.

Was Context Manager sind kannst du in der Dokumentation nachlesen.