commit 77d53d146bfbeef0ca7fc2951cc0239495357fe0 Author: = <=> Date: Wed Feb 7 15:04:23 2024 +0100 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d8ff0fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.vscode +/__pycache__ \ No newline at end of file diff --git a/calcPi.py b/calcPi.py new file mode 100644 index 0000000..bdd2915 --- /dev/null +++ b/calcPi.py @@ -0,0 +1,67 @@ +from tkinter import Canvas, Frame, BOTH +from matplotlib import colors +from numpy import pi, gcd +from random import random +from math import sqrt, floor +#from util.numberTheory import isCoprime +import matplotlib.pyplot as plt +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg + +class calcPi(Frame): + + def __init__(self, x, y) -> None: + super().__init__() + self.dimensions = (x, y) + self.initialize_draw() + + def initialize_vals(self, digits, n): + self.limit = 2**digits + self.coprime = 0 + self._coprime = 0 + self.pi_approx = [0]*n + + def initialize_draw(self): + self.master.title('RandomPi') + self.pack(fill=BOTH, expand=1) + self.figure = plt.figure() + self.canvas = FigureCanvasTkAgg(self.figure, self) + self.canvas.get_tk_widget().pack(fill=BOTH, expand=1) + self.pack(fill=BOTH, expand=1) + + def draw(self): + n = self.coprime + self._coprime + offset = 14000/n + y = self.pi_approx[-1] + plt.axes(ylim=[pi-offset, pi+offset]) + plt.plot(self.pi_approx) + plt.axhline(y=y) + plt.axhline(y=pi, color='red') + ticks, _ = plt.yticks() + labels = ['{:1.3f}'.format(t) for t in ticks] \ + + ["{:1.3f} ".format(y), \ + 'π '] + plt.yticks(list(ticks) + [y, pi], labels) + plt.xlabel(f'approx. π: {y}, error: {abs(pi-y)}') + + def run(self, n): + self.initialize_vals(24, n) + for i in range(n): + self._run_step(i) + + def _run_step(self, i): + self.step() + self.calcPi(i) + + def step(self): + r1 = floor(random() * self.limit) + r2 = floor(random() * self.limit) + if gcd(r1, r2) == 1: + self.coprime += 1 + else: + self._coprime += 1 + + def calcPi(self, i): + cp = self.coprime + _cp = self._coprime + if not cp == 0: + self.pi_approx[i] = sqrt(6/(cp/(cp+_cp))) diff --git a/main.py b/main.py new file mode 100644 index 0000000..77194ba --- /dev/null +++ b/main.py @@ -0,0 +1,18 @@ +from tkinter import Tk +from calcPi import calcPi + +def main(n=10000000): + x = 1000 + y = 600 + root = Tk() + + root.geometry(str(x)+'x'+str(y)+'+300+300') + + cP = calcPi(100, 100) + cP.run(n) + cP.draw() + + cP.mainloop() + +if __name__ == "__main__": + main() \ No newline at end of file