Advertisement
Guest User

Untitled

a guest
May 26th, 2015
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.48 KB | None | 0 0
  1. # -*- coding: cp1251 -*-
  2. import random
  3. from Tkinter import *
  4.  
  5. class Application(Frame):
  6. def __init__(self, master):
  7. Frame.__init__(self, master)
  8. self.grid()
  9. self.create_widgets()
  10.  
  11. def create_widgets(self):
  12. self.instruction = Label(self, text = u"Для генерации укажите размер числа и необходимое количество:")
  13. self.instruction.grid(row = 0, column = 0, columnspan = 4, sticky = N)
  14.  
  15. self.stroka = Entry(self, width = 15)
  16. self.stroka.grid(row=3, rowspan=2, column = 1, sticky = E)
  17.  
  18. self.stroka1 = Entry(self, width = 15)
  19. self.stroka1.grid(row=3, rowspan=2, column = 2, sticky = E)
  20.  
  21. flag = IntVar()
  22. flag.set(0)
  23. Radiobutton(self, text = u"Десятки", variable = flag,
  24. value = '0').grid(row=3, column=0, columnspan = 2, sticky=W)
  25. Radiobutton(self, text = u"Биты", variable = flag,
  26. value = '1').grid(row=4, column=0, columnspan = 2, sticky=W)
  27.  
  28. self.button1 = Button(self, text = u"Генерировать", command = self.reveal)
  29. self.button1.grid(row = 3, rowspan = 2, column = 3, sticky = E)
  30.  
  31. self.text = Text(self, width = 100, height = 10, wrap = WORD)
  32. self.text.grid(row = 5, column = 0, columnspan = 10, sticky = N+S)
  33.  
  34.  
  35.  
  36.  
  37.  
  38. def get_n(self, lenght):
  39. g = self.flag
  40. if g:
  41. while True:
  42. n_raw = [str(random.choice(range(10))) for _ in xrange(lenght)]
  43. number = ''.join(n_raw)
  44. if not number.startswith('0'):
  45. if number[-1] not in ('2', '4', '6', '8', '0', '5'):break
  46. else: random.getrandbits(number)
  47. return int(number)
  48.  
  49.  
  50. def get_s_and_d(self, number):
  51. d = number - 1
  52. s = 0
  53. while True: # рассчет s и d на основе n
  54. s += 1
  55. d /= 2
  56. if d % 2:break
  57. return s, d
  58.  
  59.  
  60. def check_number(self, number, count_tests, s, d):
  61. for test in range(0, count_tests): # Тест на простоту до k раз
  62. a = random.randint(2, number-1) # Случайное А
  63. for r in range(0, s):
  64. z = 2 ** r * d
  65. b = pow(a, z, number)
  66. if r == 0 and b == 1:
  67. break
  68. if b == number - 1:
  69. break
  70. if r == (s - 1):
  71. count_tests = 0
  72. if count_tests == 0:
  73. return False
  74. return True
  75.  
  76. def reveal(self):
  77. v = int(self.stroka.get())
  78. p = self.stroka1.get()
  79. i=0
  80. self.text.delete(0.0, END)
  81. if not p and v: return # Если пустая строка - возврат
  82. for l in p: # Если есть латиница, кириллица или пробелы - возврат
  83. if l==' ':return
  84. if 'a'<=l<='z':return
  85. if u'а'<=l<=u'я':return
  86. while i < p:
  87. n = self.get_n(v)
  88. s, d = self.get_s_and_d(n)
  89. if self.check_number(n, k, s, d):
  90. i += 1
  91. message = '%s: %s \n' % (i, n)
  92. self.text.insert(0.0, message)
  93. k=25
  94.  
  95. root = Tk()
  96. root.title(u"Проверка числа на простоту")
  97. root.geometry("810x300")
  98. app = Application(root)
  99.  
  100. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement