



"""simple docstring"""







import os
import random
import sys

from . import cryptomath_module as cryptoMath  # noqa: N812
from . import rabin_miller as rabinMiller  # noqa: N812



def      __UpperCAmelCase      (    )							->      None:
		print('''Making key files...'''	)
		make_key_files('''rsa'''						,     10_24	)
		print('''Key files generation successful.'''	)



def      __UpperCAmelCase      (    __lowerCamelCase	)							->      tuple[tuple[int, int], tuple[int, int]]:
		print('''Generating prime p...'''	)
		lowercase__   :    Optional[Any]				=			rabinMiller.generate_large_prime(__lowerCamelCase	)
		print('''Generating prime q...'''	)
		lowercase__   :    Tuple				=			rabinMiller.generate_large_prime(__lowerCamelCase	)
		lowercase__   :    str				=			p * q

		print('''Generating e that is relatively prime to (p - 1) * (q - 1)...'''	)
		while True:
				lowercase__   :    Optional[int]				=			random.randrange(2 ** (key_size - 1)						,     2 ** (key_size)	)
				if cryptoMath.gcd(__lowerCamelCase						,     (p - 1) * (q - 1)	) == 1:
						break

		print('''Calculating d that is mod inverse of e...'''	)
		lowercase__   :    List[Any]				=			cryptoMath.find_mod_inverse(__lowerCamelCase						,     (p - 1) * (q - 1)	)

		lowercase__   :    str				=			(n, e)
		lowercase__   :    int				=			(n, d)
		return (public_key, private_key)



def      __UpperCAmelCase      (    __lowerCamelCase						,     __lowerCamelCase	)							->      None:
		if os.path.exists(f"""{name}_pubkey.txt"""	) or os.path.exists(f"""{name}_privkey.txt"""	):
				print('''\nWARNING:'''	)
				print(
				    f"""\"{name}_pubkey.txt\" or \"{name}_privkey.txt\" already exists. \n"""
				    '''Use a different name or delete these files and re-run this program.'''	)
				sys.exit()

		lowercase__		,			lowercase__   :    Union[str, Any]				=			generate_key(__lowerCamelCase	)
		print(f"""\nWriting public key to file {name}_pubkey.txt..."""	)
		with open(f"""{name}_pubkey.txt"""						,     '''w'''	) as out_file:
				out_file.write(f"""{key_size},{public_key[0]},{public_key[1]}"""	)

		print(f"""Writing private key to file {name}_privkey.txt..."""	)
		with open(f"""{name}_privkey.txt"""						,     '''w'''	) as out_file:
				out_file.write(f"""{key_size},{private_key[0]},{private_key[1]}"""	)


if __name__ == "__main__":
							main()

"""simple docstring"""






from __future__ import annotations

from scipy.special import comb  # type: ignore





class  _A						:

      def __init__(						self		,       __lowerCAmelCase						):







            """simple docstring"""



            lowercase														=	list_of_points
            # Degree determines the flexibility of the curve.
            # Degree = 1 will produce a straight line.
            lowercase														=	len(__lowerCAmelCase						) - 1

      def 				A__       (						self		,       __lowerCAmelCase						):







            """simple docstring"""



            assert 0 <= t <= 1, "Time t must be between 0 and 1."
            lowercase														=	[]
            for i in range(len(self.list_of_points						)						):
                  # basis function for each i
                  output_values.append(
                      comb(self.degree		,       __lowerCAmelCase						) * ((1 - t) ** (self.degree - i)) * (t**i)						)
            # the basis must sum up to 1 for it to produce a valid Bezier curve.
            assert round(sum(__lowerCAmelCase						)		,       5						) == 1
            return output_values

      def 				A__       (						self		,       __lowerCAmelCase						):







            """simple docstring"""



            assert 0 <= t <= 1, "Time t must be between 0 and 1."

            lowercase														=	self.basis_function(__lowerCAmelCase						)
            lowercase														=	0.0
            lowercase														=	0.0
            for i in range(len(self.list_of_points						)						):
                  # For all points, sum up the product of i-th basis function and i-th point.
                  x += basis_function[i] * self.list_of_points[i][0]
                  y += basis_function[i] * self.list_of_points[i][1]
            return (x, y)







      def 				A__       (						self		,       __lowerCAmelCase = 0.0_1						):







            """simple docstring"""



            from matplotlib import pyplot as plt  # type: ignore

            lowercase														=	[]  # x coordinates of points to plot
            lowercase														=	[]  # y coordinates of points to plot

            lowercase														=	0.0
            while t <= 1:
                  lowercase														=	self.bezier_curve_function(__lowerCAmelCase						)
                  to_plot_x.append(value[0]						)
                  to_plot_y.append(value[1]						)
                  t += step_size

            lowercase														=	[i[0] for i in self.list_of_points]
            lowercase														=	[i[1] for i in self.list_of_points]

            plt.plot(
                __lowerCAmelCase		,       __lowerCAmelCase		,       color="""blue"""		,       label="""Curve of Degree """ + str(self.degree						)		,       )
            plt.scatter(__lowerCAmelCase		,       __lowerCAmelCase		,       color="""red"""		,       label="""Control Points"""						)
            plt.legend()
            plt.show()


if __name__ == "__main__":
       import doctest

       doctest.testmod()

       BezierCurve([(1, 2), (3, 5)]).plot_curve()  # degree 1
       BezierCurve([(0, 0), (5, 5), (5, 0)]).plot_curve()  # degree 2
       BezierCurve([(0, 0), (5, 5), (5, 0), (2.5, -2.5)]).plot_curve()  # degree 3



