class MiscTab(Tab): def __init__(self, master, name): Tab.__init__(self, master, name) self.a = 43827423 self.b = 8372842 self.p = 7447344552397 self.P = Polynomial("z^29 + z^18 + z^3 + 1") self.Q = Polynomial("z^17 + z^13 + z^11 + z^7") self.k = 473423 self.R = Polynomial("z^32 + z^26 + z^23 + z^22 + z^16 + z^12 + z^11 + z^10 + z^8 + z^7 + z^5 + z^4 + z^2 + z + 1") # default is crc-32 poly outputFrame = Frame(self) Button(outputFrame, text="Clear Output", bg="blue", fg="white", command=(lambda: self.clear()), borderwidth=1).pack(side=BOTTOM, pady=3) self._output = Text(outputFrame, height=15, width=65) self._output.insert(END, "You are responsible for making sure the irreducible polynomial you use is actually irreducible. " "The default, z^32 + z^26 + z^23 + z^22 + z^16 + z^12 + z^11 + z^10 + z^8 + z^7 + z^5 + z^4 + z^2 + z + 1," " is irreducible.\n\n") self._output.pack(side=LEFT) scrollbar = Scrollbar(outputFrame) scrollbar.pack(side=RIGHT, fill=Y) scrollbar.config(command=self._output.yview) modularInput = Frame(self) modularButtons = Frame(self) polyInput = Frame(self) irredFrame = Frame(self) polyOut1 = Frame(self) polyOut2 = Frame(self) Label(modularInput, text="a = ", bg="orange", fg="black", borderwidth=1).grid(row=1, column=1, pady=3) self._a = Entry(modularInput, width=10) self._a.insert(0, self.a) self._a.bind("<Return>", (lambda event: self.changeA())) self._a.grid(row=1, column=2, pady=3) Label(modularInput, text=" b = ", bg="orange", fg="black", borderwidth=1).grid(row=1, column=3, pady=3) self._b = Entry(modularInput, width=10) self._b.insert(0, self.b) self._b.bind("<Return>", (lambda event: self.changeB())) self._b.grid(row=1, column=4, pady=3) Label(modularInput, text=" p = ", bg="orange", fg="black", borderwidth=1).grid(row=1, column=5, pady=3) self._p = Entry(modularInput, width=20) self._p.insert(0, self.p) self._p.bind("<Return>", (lambda event: self.changePrime())) self._p.grid(row=1, column=6, pady=3) Button(modularInput, text="Generate Random Prime", bg="blue", fg="white", command=(lambda: self.generatePrime())).grid(row=1, column=7, padx=5, pady=3) Button(modularButtons, text="a^b (mod p)", bg="blue", fg="white", command=(lambda: self.modExp())).grid(row=1, column=1, padx=5, pady=3) Button(modularButtons, text="1/a (mod p)", bg="blue", fg="white", command=(lambda: self.inverse())).grid(row=1, column=2, padx=5, pady=3) Button(modularButtons, text="sqrt(a) (mod p)", bg="blue", fg="white", command=(lambda: self.sqrt())).grid(row=1, column=3, padx=5, pady=3) Label(polyInput, text="P(z) = ", bg="orange", fg="black", borderwidth=1).grid(row=1, column=1, pady=3) self._P = Entry(polyInput, width=25) self._P.insert(0, self.P) self._P.bind("<Return>", (lambda event: self.changeP())) self._P.grid(row=1, column=2, pady=3) Label(polyInput, text=" Q(z) = ", bg="orange", fg="black", borderwidth=1).grid(row=1, column=3, pady=3) self._Q = Entry(polyInput, width=25) self._Q.insert(0, self.Q) self._Q.bind("<Return>", (lambda event: self.changeQ())) self._Q.grid(row=1, column=4, pady=3) Label(irredFrame, text="R(z) = ", bg="orange", fg="black", borderwidth=1).grid(row=1, column=1, pady=3) self._R = Entry(irredFrame, width=25) self._R.insert(0, self.R) self._R.bind("<Return>", (lambda event: self.changeR())) self._R.grid(row=1, column=2, pady=3) Label(irredFrame, text=" k = ", bg="orange", fg="black", borderwidth=1).grid(row=1, column=3, pady=3) self._k = Entry(irredFrame, width=10) self._k.insert(0, self.k) self._k.bind("<Return>", (lambda event: self.changeK())) self._k.grid(row=1, column=4, pady=3) Button(polyOut1, text="P(z) + Q(z) (mod R(z))", bg="blue", fg="white", command=(lambda: self.polyAdd())).grid(row=1, column=1, padx=5, pady=3) Button(polyOut1, text="P(z) * Q(z) (mod R(z))", bg="blue", fg="white", command=(lambda: self.polyMult())).grid(row=1, column=2, padx=5, pady=3) Button(polyOut2, text="P(z)^k (mod R(z))", bg="blue", fg="white", command=(lambda: self.polyModExp())).grid(row=1, column=1, padx=5, pady=3) Button(polyOut2, text="1/P(z) (mod R(z))", bg="blue", fg="white", command=(lambda: self.polyInverse())).grid(row=1, column=2, padx=5, pady=3) Button(polyOut2, text="sqrt(P(z)) (mod R(z))", bg="blue", fg="white", command=(lambda: self.polySqrt())).grid(row=1, column=3, padx=5, pady=3) modularInput.pack(side=TOP) modularButtons.pack(side=TOP) polyInput.pack(side=TOP) irredFrame.pack(side=TOP) polyOut1.pack(side=TOP) polyOut2.pack(side=TOP) outputFrame.pack(side=BOTTOM) def changeA(self): try: self.a = int(self._a.get()) % self.p self._a.delete(0, END) self._a.insert(0, self.a) self._output.insert(END, "a = " + str(self.a) + "\n") except ValueError: self._a.delete(0, END) self._a.insert(0, self.a) self._output.insert(END, "There was an error with your input. Please try again.\n") def changeB(self): try: self.b = int(self._b.get()) % self.p self._b.delete(0, END) self._b.insert(0, self.b) self._output.insert(END, "b = " + str(self.b) + "\n") except ValueError: self._b.delete(0, END) self._b.insert(0, self.b) self._output.insert(END, "There was an error with your input. Please try again.\n") def changePrime(self): try: temp = int(self._p.get()) if ECMath.isPrime(temp): self.p = temp self._p.delete(0, END) self._p.insert(0, self.p) self._output.insert(END, "p = " + str(self.p) + "\n") else: self._output.insert(END, str(temp) + " is not prime. Please try again.\n") self._p.delete(0, END) self._p.insert(0, self.p) except ValueError: self._p.delete(0, END) self._p.insert(0, self.p) self._output.insert(END, "There was an error with your input. Please try again.\n") def generatePrime(self): digits = randint(1, 40) self.p = ECMath.randomPrime(digits) self._p.delete(0, END) self._p.insert(0, self.p) self._output.insert(END, "p = " + str(self.p) + "\n") def modExp(self): temp = pow(self.a, self.b, self.p) self._output.insert(END, str(self.a) + "^" + str(self.b) + " (mod " + str(self.p) + ") = " + str(temp) + "\n") def inverse(self): temp = ECMath.inverse(self.a, self.p) if temp != -1: self._output.insert(END, "1/" + str(self.a) + " (mod " + str(self.p) + ") = " + str(temp) + "\n") else: self._output.insert(END, "1/" + str(self.a) + " (mod " + str(self.p) + ") = undefined\n") def sqrt(self): if self.a % self.p == 0: self._output.insert(END, "sqrt(" + str(self.a) + ") (mod " + str(self.p) + ") = 0\n") elif ECMath.jacobi(self.a, self.p) == 1: temp = ECMath.sqrt(self.a, self.p) self._output.insert(END, "sqrt(" + str(self.a) + ") (mod " + str(self.p) + ") = " + str(temp) + "\n") else: self._output.insert(END, str(self.a) + " is not a square (mod " + str(self.p) + ")\n") def changeP(self): temp = self._P.get() if Polynomial.isValid(temp): self.P = Polynomial(temp) % self.R self._P.delete(0, END) self._P.insert(0, self.P) self._output.insert(END, "P(z) = " + str(self.P) + "\n") else: self._P.delete(0, END) self._P.insert(0, self.P) self._output.insert(END, "There was an error with your input. Please try again.\n") def changeQ(self): temp = self._Q.get() if Polynomial.isValid(temp): self.Q = Polynomial(temp) % self.R self._Q.delete(0, END) self._Q.insert(0, self.Q) self._output.insert(END, "Q(z) = " + str(self.Q) + "\n") else: self._Q.delete(0, END) self._Q.insert(0, self.Q) self._output.insert(END, "There was an error with your input. Please try again.\n") def changeR(self): temp = self._R.get() if Polynomial.isValid(temp): self.R = Polynomial(temp) self._R.delete(0, END) self._R.insert(0, self.R) self._output.insert(END, "R(z) = " + str(self.R) + "\n") else: self._R.delete(0, END) self._R.insert(0, self.R) self._output.insert(END, "There was an error with your input. Please try again.\n") def changeK(self): try: self.k = int(self._k.get()) self._k.delete(0, END) self._k.insert(0, self.k) self._output.insert(END, "k = " + str(self.k) + "\n") except ValueError: self._k.delete(0, END) self._k.insert(0, self.k) self._output.insert(END, "There was an error with your input. Please try again.\n") def polyAdd(self): temp = (self.P + self.Q) % self.R self._output.insert(END, "P(z) + Q(z) = (" + str(temp) + ") (mod R(z))\n") def polyMult(self): temp = (self.P * self.Q) % self.R self._output.insert(END, "P(z) * Q(z) = (" + str(temp) + ") (mod R(z))\n") def polyModExp(self): temp = self.P.modExp(self.k, self.R) self._output.insert(END, "P(z)^" + str(self.k) + " = (" + str(temp) + ") (mod R(z))\n") def polyInverse(self): temp = self.P.inverse(self.R) if temp is None: self._output.insert(END, "1/(P(z)) = undefined (mod R(z))\n") else: self._output.insert(END, "1/(P(z)) = (" + str(temp) + ") (mod R(z))\n") def polySqrt(self): temp = self.P.sqrt(self.R) self._output.insert(END, "sqrt(P(z)) = (" + str(temp) + ") (mod R(z))\n") def clear(self): self._output.delete(1.0, END) self._output.insert(END, "You are responsible for making sure the irreducible polynomial you use is actually irreducible. " "The default, z^32 + z^26 + z^23 + z^22 + z^16 + z^12 + z^11 + z^10 + z^8 + z^7 + z^5 + z^4 + z^2 + z + 1," " is irreducible.\n\n")