



import os
import random
import sys

from . import cryptomath_module as cryptomath
from . import rabin_miller

lowerCAmelCase__					  =  3


def  __lowerCamelCase (       lowerCamelCase__						):

				"""simple docstring"""


				print("Generating primitive root of p"						)
				while True:
								lowercase__					:   List[str]													=					random.randrange(3					,			lowerCamelCase__						)
								if pow(lowerCamelCase__					,			2					,			lowerCamelCase__						) == 1:
												continue
								if pow(lowerCamelCase__					,			lowerCamelCase__					,			lowerCamelCase__						) == 1:
												continue
								return g


def  __lowerCamelCase (       lowerCamelCase__						):

				"""simple docstring"""


				print("Generating prime p..."						)
				lowercase__					:   List[Any]													=					rabin_miller.generate_large_prime(lowerCamelCase__						)  # select large prime number.
				lowercase__					:   str													=					primitive_root(lowerCamelCase__						)  # one primitive root on modulo p.
				lowercase__					:   List[str]													=					random.randrange(3					,			lowerCamelCase__						)  # private_key -> have to be greater than 2 for safety.
				lowercase__					:   Dict													=					cryptomath.find_mod_inverse(pow(lowerCamelCase__					,			lowerCamelCase__					,			lowerCamelCase__						)					,			lowerCamelCase__						)

				lowercase__					:   List[Any]													=					(key_size, e_a, e_a, p)
				lowercase__					:   List[Any]													=					(key_size, d)

				return public_key, private_key


def  __lowerCamelCase (       lowerCamelCase__					,			lowerCamelCase__						):

				"""simple docstring"""


				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__					:   Optional[int]													=					generate_key(lowerCamelCase__						)
				print(F"""\nWriting public key to file {name}_pubkey.txt..."""						)
				with open(F"""{name}_pubkey.txt"""					,			"w"						) as fo:
								fo.write(F"""{public_key[0]},{public_key[1]},{public_key[2]},{public_key[3]}"""						)

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


def  __lowerCamelCase (       ):

				"""simple docstring"""


				print("Making key files..."						)
				make_key_files("elgamal"					,			2_048						)
				print("Key files generation successful"						)


if __name__ == "__main__":
				main()









from math import ceil, sqrt


def  __lowerCamelCase (       lowerCamelCase__ = 1_000_000						):

				"""simple docstring"""


				lowercase__					:   int													=					0

				for outer_width in range(3					,			(limit // 4) + 2						):
								if outer_width**2 > limit:
												lowercase__					:   List[str]													=					max(ceil(sqrt(outer_width**2 - limit						)						)					,			1						)
								else:
												lowercase__					:   List[str]													=					1
								if (outer_width - hole_width_lower_bound) % 2:
												hole_width_lower_bound += 1

								answer += (outer_width - hole_width_lower_bound - 2) // 2 + 1

				return answer


if __name__ == "__main__":
				print(f'''{solution() = }''')




