Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: cp1251 -*-
- import random
- from Tkinter import *
- class Application(Frame):
- def __init__(self, master):
- Frame.__init__(self, master)
- self.grid()
- self.create_widgets()
- def create_widgets(self):
- self.instruction = Label(self, text = u"Для генерации укажите размер числа и необходимое количество:")
- self.instruction.grid(row = 0, column = 0, columnspan = 4, sticky = N)
- self.stroka = Entry(self, width = 15)
- self.stroka.grid(row=3, rowspan=2, column = 1, sticky = E)
- self.stroka1 = Entry(self, width = 15)
- self.stroka1.grid(row=3, rowspan=2, column = 2, sticky = E)
- flag = IntVar()
- flag.set(0)
- Radiobutton(self, text = u"Десятки", variable = flag,
- value = '0').grid(row=3, column=0, columnspan = 2, sticky=W)
- Radiobutton(self, text = u"Биты", variable = flag,
- value = '1').grid(row=4, column=0, columnspan = 2, sticky=W)
- self.button1 = Button(self, text = u"Генерировать", command = self.reveal)
- self.button1.grid(row = 3, rowspan = 2, column = 3, sticky = E)
- self.text = Text(self, width = 100, height = 10, wrap = WORD)
- self.text.grid(row = 5, column = 0, columnspan = 10, sticky = N+S)
- def get_n(self, lenght):
- g = self.flag
- if g:
- while True:
- n_raw = [str(random.choice(range(10))) for _ in xrange(lenght)]
- number = ''.join(n_raw)
- if not number.startswith('0'):
- if number[-1] not in ('2', '4', '6', '8', '0', '5'):break
- else: random.getrandbits(number)
- return int(number)
- def get_s_and_d(self, number):
- d = number - 1
- s = 0
- while True: # рассчет s и d на основе n
- s += 1
- d /= 2
- if d % 2:break
- return s, d
- def check_number(self, number, count_tests, s, d):
- for test in range(0, count_tests): # Тест на простоту до k раз
- a = random.randint(2, number-1) # Случайное А
- for r in range(0, s):
- z = 2 ** r * d
- b = pow(a, z, number)
- if r == 0 and b == 1:
- break
- if b == number - 1:
- break
- if r == (s - 1):
- count_tests = 0
- if count_tests == 0:
- return False
- return True
- def reveal(self):
- v = int(self.stroka.get())
- p = self.stroka1.get()
- i=0
- self.text.delete(0.0, END)
- if not p and v: return # Если пустая строка - возврат
- for l in p: # Если есть латиница, кириллица или пробелы - возврат
- if l==' ':return
- if 'a'<=l<='z':return
- if u'а'<=l<=u'я':return
- while i < p:
- n = self.get_n(v)
- s, d = self.get_s_and_d(n)
- if self.check_number(n, k, s, d):
- i += 1
- message = '%s: %s \n' % (i, n)
- self.text.insert(0.0, message)
- k=25
- root = Tk()
- root.title(u"Проверка числа на простоту")
- root.geometry("810x300")
- app = Application(root)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement