Advertisement
Guest User

Untitled

a guest
Jul 16th, 2011
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.38 KB | None | 0 0
  1.  
  2. import math
  3. from decimal import Decimal, Context
  4. ctx = Context(prec=20)
  5.  
  6.  
  7. # Generator, um Primzahlen zu erzeugen
  8. def prim():
  9.     yield 2
  10.     i = 3
  11.     while True:
  12.         check = True
  13.         for j in range(2, round(math.sqrt(i))+1):
  14.             if i % j == 0:
  15.                 check = False
  16.         if check:
  17.             yield i
  18.         i += 2
  19.  
  20. # Das ist der Codeteil, der eigentlich interessiert.
  21. # Hier wird versucht, ein passendes n zu ermitteln
  22. # Die while-Schleife, also die ersten 8 Zeilen, sind der eigentliche Code
  23. # Der Rest dient zur Optimierung, damit nicht in 1er-Schritten hochgezählt wird
  24. def find_n(x):
  25.     i = 1
  26.     while True:
  27.         a = ctx.log10(i*x + 1)
  28.         b = ctx.log10(i*x - 1)
  29.         if a == int(a):
  30.             return a, "nicht alternierend"
  31.         if b == int(b):
  32.             return b, "alternierend"
  33.        
  34.  
  35.         for k in list(range(20, 1, -1))+[1.9, 1.8, 1.7, 1.6, 1.5, 1.4, 1.3, 1.2, 1.1, 1.1, 1.01, 1.001, 1.0001, 1.00001, 1.000001, 1.0000001, 1.00000001, 1.000000001, 1.0000000001, 1.00000000001, 1.000000000001, 1.0000000000001, 1.00000000000001, 1.000000000000001]:
  36.             i_alt = i
  37.             while True:
  38.                 if k*i*x < 10**(len(str(i_alt*x)))-1 and math.floor(k*i) != i:
  39.                     i = math.floor(k*i)
  40.                 else:
  41.                     break
  42.         i += 1 # Falls i nicht mehr mit Hilfe der obigen Optimierungen erhöht werden kann, um 1 erhöhen
  43.  
  44. # Folgende 2 Funktionen sind vorest nicht von Bedeutung
  45. def alt_quersumme(n):
  46.     return 10**9 % n
  47.  
  48. def n_alt_quersumme(n):
  49.     if not 10**9 % n == 0:
  50.         return math.floor(10**9/n) * int("1"*n) + int("1"*(10**9 % n))
  51.     else:
  52.         return math.floor(10**9/n) * int("1"*n)
  53.        
  54.  
  55. # Hauptprogramm, aber eigentlich nicht so sehr von Bedeutung
  56. teiler = []
  57. for i in prim():
  58.     if len(teiler) >= 40:
  59.         break
  60.     if not i == 5 and not i == 2:
  61.         x = find_n(i)
  62.         #print(str(i) + ": " + str(round(x[0])) + "er Quersumme, " + str(x[1]))
  63.         if x[1][0] == "n":
  64.             if n_alt_quersumme(round(x[0])) % i == 0:
  65.                 print("TEILER")
  66.                 teiler.append(i)
  67.         else:
  68.             if alt_quersumme(round(x[0])) % i == 0:
  69.                 print("TEILER")
  70.                 teiler.append(i)
  71.     #print("\n--------------------------------------------------------------\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement