Пример #1
0
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")