
Einfache Version des Posts: Kann ich in Python irgendwie Zahlen beliebig genau darstellen lassen? 1 + 1/10^x wird bei einem genügend großen x einfach zu 1 abgerundet.
Ich glaube aber, dass genauere Zahlen die Geschwindigkeit schon genügend beschleunigen könnten.
Jetzt folgt die kompliziertere Version, in der ich detaillierter erkläre, um was es geht.
Ich versuche eine Aufgabe bei Project Euler zu lösen, da ich aber weiß, dass man die Ergebnisse und Lösungswege möglichst nicht verraten soll, werde ich hier allgemein bleiben.
Ich habe ein Programm geschrieben, welches es mir erlaubt, eine Teilbarkeitsregel basierend auf der alternierenden oder nichtalternierenden Quersumme für jede beliebige Zahl, die teilerfremd zu 10 ist, zu errechnen.
Wie das geht, habe ich mir bei Wikipedia angeguckt: http://de.wikipedia.org/wiki/Teilbarkeit#Weitere_Regeln
genaues Zitat:
Diese Teilbarkeitsregel suche ich für alle Primzahlen bis zu einer gewissen Grenze, welche dem Programm vorher nicht bekannt ist.Will man für eine Zahl x eine Teilbarkeitsregel mit Quersummen aufstellen, so sucht man nach einem Vielfachen, das entweder 10^n − 1 oder 10^n + 1 für ein beliebiges n ist. Ist das Vielfache 10^n − 1, dann gilt die Teilbarkeitsregel „Eine Zahl ist genau dann durch x teilbar, wenn ihre nichtalternierende n-Quersumme durch x teilbar ist.“ Ist das Vielfache hingegen 10^n + 1, dann gilt die Teilbarkeitsregel „Eine Zahl ist genau dann durch x teilbar, wenn ihre alternierende n-Quersumme durch x teilbar ist.“
Nun geht es ja erst mal darum, ein geeignetes n zu finden. Dies tue ich, indem ich die Zahl x mit einer Laufvariable multipliziere, so lange, bis ich zu einer Zehnerpotenz plus/minus 1 komme.
Also zu 9, 11, 99, 101, 999, 1001, ...

Hier der Code: http://pastebin.com/2dsn2HWs (Zeile 20-42 ist wichtig)
Es ist eigentlich nur die 2. Funktion wichtig, da sie die Teilbarkeitsregel findet, bzw eben das gesuchte n findet.
Ich weiß, es ist nicht schön und manche Dinge sind nicht "sauber" und "pythonisch" gelöst, aber darum geht es mir bei so einem "Wegwerfprogramm" nicht. Es soll ein mal funktionieren, dann weg damit

So jetzt zu meiner Frage, nach dem ich so lange geschwafelt habe:
Das Programm scheint einwandfrei zu funktionieren, aber es ist trotz meiner Optimierungsversuche zu langsam, da es sehr viele Primzahlen überprüfen muss.
Hat irgendjemand Verbesserungsvorschläge?
Meine Optimierung beruht darauf: Normalerweise müsste ich die Laufvariable i in der Funktion find_n(x) jedes mal um einen Schritt erhöhen, was bei Zahlen mit n=22 ziemlich lange dauern würde, da ich ja 10^22 Schleifendurchläufe für eine einzige Zahl hätte.
Daher versuche ich die Zahl i möglichst schnell, möglichst viel zu erhöhen, ohne dabei auf die nächste Zehnerpotenz zu kommen, da ich ja gerade dort meine Überprüfung ansetze, ob die Zehnerpotenz +- 1 ein Vielfaches von x ist.
Daher habe ich mir gedacht, ich erhöhe den Wert so weit wie möglich, bestenfalls auf das 20fache.
Da ich aber dann immer noch kleinere Abstufungen brauche, um nicht zwischen den Vielfachen, die im Programmcode durch die Variable k gekennzeichnet sind, lauter 1er Schritte zu machen, habe ich dann diese 1.01 und 1.0001 etc. noch eingefügt, was die Berechnungszeit aufs extremste verringert hat, wenn man die vorherige als Vergleich nimmt.
Immerhin sind 1/1000000000 von 10^22 trotzdem sehr sehr viel und erspart mir viele viele Schleifendurchläufe.
Leider gibt es eine gewisse Grenze, ab der Python einfach zu 1 abrundet, auch mit Decimals. Ich denke das würde mein Problem ansonsten schon beseitigen.
Nun ja, wer mir bis hier hin folgen konnte und es auch geschafft hat, sich in den Programmcode und die mathematische Grundlage einzuarbeiten: Respekt

Vielen Dank schon mal, ich hoffe jemand blickt hier durch und hat noch einen Tipp für mich.
Falls das hier zu kompliziert dargestellt ist, kann ich gerne noch mal einen Anlauf starten und mich noch mehr auf das wesentliche beziehen und ein paar Dinge genauer erläutern.
Ich kann auch versuchen, ein paar Fragen komplett von dem Problem loszulösen und in vereinfachter Form darzustellen.
Ich will natürlich nicht eure Intelligenz beleidigen, aber ich persönlich würde glaube ich nicht, ohne mir etwas länger Zeit zu nehmen, verstehen, worum es in diesem Post genau geht

PS: Wer mein Programm mal ausprobieren möchte, um sich einen besseren Überblick zu verschaffen, der sollte im unteren Teil, den ich als Hauptprogramm gekennzeichnet habe, einfach mal die Kommentare entfernen (jaja, ich weiß, __main__ wäre angebracht).
Einfach mal ein paar Zeilen ausgeben lassen und angucken
