goin' somewhere
This commit is contained in:
parent
5239ef12d8
commit
6a751eba47
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
|
venv/
|
||||||
|
@ -2,16 +2,17 @@ from util import Object
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
CURVE_LINSPACE = np.linspace(-10, 30, num=1000)
|
CURVE_LINSPACE = np.linspace(-10, 10, num=2000)
|
||||||
|
|
||||||
DEFAULT_CURVE = (3, 3)
|
DEFAULT_CURVE = (3, 3, 11)
|
||||||
NSA_CURVE = (3, 0)
|
NSA_CURVE = (3, 0, 2**384 - 2**128 - 2**96 + 2**32 - 1)
|
||||||
BTC_CURVE = (0, 7)
|
BTC_CURVE = (0, 7, 2**256 - 2**32 - 2**9 - 2**8 - 2**7 - 2**6 - 2**4 - 1)
|
||||||
|
|
||||||
class EllipticCurve(Object):
|
class EllipticCurve(Object):
|
||||||
def __init__(self, a, b):
|
def __init__(self, a, b, mod):
|
||||||
self.a = a
|
self.a = a
|
||||||
self.b = b
|
self.b = b
|
||||||
|
self.mod = mod
|
||||||
self.xl = CURVE_LINSPACE
|
self.xl = CURVE_LINSPACE
|
||||||
self.yl = self._x2y()
|
self.yl = self._x2y()
|
||||||
def _x2y(self):
|
def _x2y(self):
|
||||||
@ -21,3 +22,7 @@ class EllipticCurve(Object):
|
|||||||
for i in range(self.xl.size):
|
for i in range(self.xl.size):
|
||||||
r[i][1] = -r[i][0]
|
r[i][1] = -r[i][0]
|
||||||
return r
|
return r
|
||||||
|
def yfromx(self, x, is_top = True):
|
||||||
|
r = np.sqrt((x**3) + (self.a * x**2) + self.b)
|
||||||
|
r = +r if is_top else -r
|
||||||
|
return r
|
||||||
|
2
main.py
2
main.py
@ -7,6 +7,8 @@ import tkinter as tk
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
state.init(elliptic_curve.DEFAULT_CURVE)
|
state.init(elliptic_curve.DEFAULT_CURVE)
|
||||||
|
state.update_points(-1)
|
||||||
|
state.update_points(-2.7, False)
|
||||||
state.display()
|
state.display()
|
||||||
tk.mainloop()
|
tk.mainloop()
|
||||||
|
|
||||||
|
45
state.py
45
state.py
@ -19,18 +19,35 @@ def clear():
|
|||||||
def display():
|
def display():
|
||||||
clear()
|
clear()
|
||||||
state.plot = state.ax.plot(state.curve.xl, state.curve.yl)
|
state.plot = state.ax.plot(state.curve.xl, state.curve.yl)
|
||||||
|
state.ax.scatter(
|
||||||
|
[i[0] for i in state.points],
|
||||||
|
[i[1] for i in state.points],
|
||||||
|
color='red', s=20, marker='o'
|
||||||
|
)
|
||||||
|
state.ax.axline(
|
||||||
|
(state.points[0][0], state.points[0][1]),
|
||||||
|
(state.points[1][0], state.points[1][1]),
|
||||||
|
linestyle='--'
|
||||||
|
)
|
||||||
state.canvas.draw()
|
state.canvas.draw()
|
||||||
|
|
||||||
def update_curve(curve=None):
|
def update_curve(curve=None):
|
||||||
global state
|
global state
|
||||||
if curve != None:
|
if curve != None:
|
||||||
a, b = curve
|
a, b, mod = curve
|
||||||
else:
|
else:
|
||||||
a = int(state.a_input.get())
|
a = int(state.a_input.get())
|
||||||
b = int(state.b_input.get())
|
b = int(state.b_input.get())
|
||||||
|
mod = int(state.mod_input.get())
|
||||||
state.a_strvar.set(a)
|
state.a_strvar.set(a)
|
||||||
state.b_strvar.set(b)
|
state.b_strvar.set(b)
|
||||||
state.curve = EllipticCurve(a, b)
|
state.mod_strvar.set(mod)
|
||||||
|
state.curve = EllipticCurve(a, b, mod)
|
||||||
|
|
||||||
|
def update_points(x, is_top = True):
|
||||||
|
y = state.curve.yfromx(x, is_top)
|
||||||
|
if y == y: # False if NaN
|
||||||
|
state.points.append((x, y))
|
||||||
|
|
||||||
def rerender(curve=None):
|
def rerender(curve=None):
|
||||||
if curve != None:
|
if curve != None:
|
||||||
@ -43,6 +60,7 @@ def init(curve):
|
|||||||
global state
|
global state
|
||||||
state = Object()
|
state = Object()
|
||||||
state.plot = tuple()
|
state.plot = tuple()
|
||||||
|
state.points = list()
|
||||||
|
|
||||||
tk_init()
|
tk_init()
|
||||||
update_curve(DEFAULT_CURVE)
|
update_curve(DEFAULT_CURVE)
|
||||||
@ -53,19 +71,14 @@ def tk_init():
|
|||||||
root.wm_title("Eliptic curves")
|
root.wm_title("Eliptic curves")
|
||||||
root.attributes('-zoomed', True)
|
root.attributes('-zoomed', True)
|
||||||
|
|
||||||
state.figure = plt.figure(figsize=(5, 4), dpi=100)
|
state.figure = plt.figure(figsize=(5, 4), dpi=150)
|
||||||
state.canvas = FigureCanvasTkAgg(state.figure, master=root)
|
state.canvas = FigureCanvasTkAgg(state.figure, master=root)
|
||||||
state.controls = ttk.Frame(root)
|
state.controls = ttk.Frame(root)
|
||||||
state.toolbar = NavigationToolbar2Tk(state.canvas, root, pack_toolbar=False)
|
state.toolbar = NavigationToolbar2Tk(state.canvas, root, pack_toolbar=False)
|
||||||
state.toolbar.update()
|
state.toolbar.update()
|
||||||
# XXX TEST REMOVE ?!?!
|
|
||||||
state.canvas.mpl_connect(
|
|
||||||
"key_press_event", lambda event: print(f"you pressed {event.key}")
|
|
||||||
)
|
|
||||||
state.canvas.mpl_connect("key_press_event", key_press_handler)
|
|
||||||
state.a_strvar = tk.StringVar()
|
state.a_strvar = tk.StringVar()
|
||||||
state.b_strvar = tk.StringVar()
|
state.b_strvar = tk.StringVar()
|
||||||
state.c_strvar = tk.StringVar()
|
state.mod_strvar = tk.StringVar()
|
||||||
|
|
||||||
def tk_fill():
|
def tk_fill():
|
||||||
global state
|
global state
|
||||||
@ -76,6 +89,8 @@ def tk_fill():
|
|||||||
(curve_equation_a := ttk.Label(state.curve_equation, textvariable=state.a_strvar, foreground="blue")),
|
(curve_equation_a := ttk.Label(state.curve_equation, textvariable=state.a_strvar, foreground="blue")),
|
||||||
ttk.Label(state.curve_equation, text="x² + "),
|
ttk.Label(state.curve_equation, text="x² + "),
|
||||||
(curve_equation_b := ttk.Label(state.curve_equation, textvariable=state.b_strvar, foreground="red")),
|
(curve_equation_b := ttk.Label(state.curve_equation, textvariable=state.b_strvar, foreground="red")),
|
||||||
|
ttk.Label(state.curve_equation, text=" mod "),
|
||||||
|
(curve_equation_mod := ttk.Label(state.curve_equation, textvariable=state.mod_strvar, foreground="magenta")),
|
||||||
]
|
]
|
||||||
state.curve_equation_a, state.curve_equation_b = curve_equation_a, curve_equation_b
|
state.curve_equation_a, state.curve_equation_b = curve_equation_a, curve_equation_b
|
||||||
state.curve_equation.pack()
|
state.curve_equation.pack()
|
||||||
@ -87,18 +102,16 @@ def tk_fill():
|
|||||||
entry_values = [
|
entry_values = [
|
||||||
("a", "blue", state.a_strvar.get(), "a_input"),
|
("a", "blue", state.a_strvar.get(), "a_input"),
|
||||||
("b", "red", state.b_strvar.get(), "b_input"),
|
("b", "red", state.b_strvar.get(), "b_input"),
|
||||||
|
("modulos", "magenta", state.mod_strvar.get(), "mod_input"),
|
||||||
]
|
]
|
||||||
f = ttk.Frame(state.controls)
|
f = ttk.Frame(state.controls)
|
||||||
f.pack()
|
f.pack()
|
||||||
for i, d in enumerate([{k:v for k,v in zip(entry_keys, t)} for t in entry_values]):
|
for i, d in enumerate([{k:v for k,v in zip(entry_keys, t)} for t in entry_values]):
|
||||||
ttk.Label(f, text=d["name"], foreground=d["color"]).grid(row=i, column=0)
|
ttk.Label(f, text=d["name"], foreground=d["color"]).grid(row=i, column=0)
|
||||||
e = state[d["label_name"]] = ttk.Entry(f)
|
w = state[d["label_name"]] = tk.Scale(f, from_=0, to=100, orient=tk.HORIZONTAL, length=200)
|
||||||
e.insert(tk.END, str(d["value_var"]))
|
w.set(d["value_var"])
|
||||||
e.bind('<FocusOut>', lambda event: rerender())
|
w.config(command=lambda event: rerender())
|
||||||
e.grid(row=i, column=1)
|
w.grid(row=i, column=1)
|
||||||
# XXX TEST ?!?!?
|
|
||||||
scale = tk.Scale(state.controls, from_=0, to=100, orient=tk.HORIZONTAL, length=200)
|
|
||||||
scale.pack()
|
|
||||||
|
|
||||||
# Preset buttons
|
# Preset buttons
|
||||||
ttk.Button(state.controls, text="Default", command=lambda: rerender(DEFAULT_CURVE)).pack()
|
ttk.Button(state.controls, text="Default", command=lambda: rerender(DEFAULT_CURVE)).pack()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user