
import string

import numpy
def 							SCREAMING_SNAKE_CASE_	(					UpperCAmelCase_	:     int			,							UpperCAmelCase_	:     int				)			->						int:
       return b if a == 0 else greatest_common_divisor(b % a			,							UpperCAmelCase_				)


class 			lowercase_		:
       __lowerCamelCase				       =						string.ascii_uppercase + string.digits
       # This cipher takes alphanumerics into account
       # i.e. a total of 36 characters

       # take x and return x % len(key_string)
       __lowerCamelCase				       =						numpy.vectorize(lambda A       : x % 3_6       )

       __lowerCamelCase				       =						numpy.vectorize(A       )


       def __init__(    self						,       __A				)						->    None:
              SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=self.modulus(__A				)  # mod36 calc's on the encrypt key
              self.check_determinant()  # validate the determinant of the encryption key
              SCREAMING_SNAKE_CASE_							:				Dict		=encrypt_key.shape[0]


       def 	_snake_case				(    self						,       __A				)						->    int:
              return self.key_string.index(__A				)


       def 	_snake_case				(    self						,       __A				)						->    str:
              return self.key_string[round(__A				)]


       def 	_snake_case				(    self				)						->    None:
              SCREAMING_SNAKE_CASE_							:				List[str]		=round(numpy.linalg.det(self.encrypt_key				)				)

              if det < 0:
                     SCREAMING_SNAKE_CASE_							:				Optional[int]		=det % len(self.key_string				)

              SCREAMING_SNAKE_CASE_							:				List[Any]		=len(self.key_string				)
              if greatest_common_divisor(__A						,       len(self.key_string				)				) != 1:
                     SCREAMING_SNAKE_CASE_							:				Any		=(
                         F'determinant modular {req_l} of encryption key({det}) '
                         F'is not co prime w.r.t {req_l}.\nTry another key.'
                     )
                     raise ValueError(__A				)


       def 	_snake_case				(    self						,       __A				)						->    str:
              SCREAMING_SNAKE_CASE_							:				List[Any]		=[char for char in text.upper() if char in self.key_string]

              SCREAMING_SNAKE_CASE_							:				Optional[Any]		=chars[-1]
              while len(__A				) % self.break_key != 0:
                     chars.append(__A				)

              return "".join(__A				)


       def 	_snake_case				(    self						,       __A				)						->    str:
              SCREAMING_SNAKE_CASE_							:				Dict		=self.process_text(text.upper()				)
              SCREAMING_SNAKE_CASE_							:				Dict		=''''''

              for i in range(0						,       len(__A				) - self.break_key + 1						,       self.break_key				):
                     SCREAMING_SNAKE_CASE_							:				Any		=text[i : i + self.break_key]
                     SCREAMING_SNAKE_CASE_							:				Optional[int]		=[self.replace_letters(__A				) for char in batch]
                     SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=numpy.array([vec]				).T
                     SCREAMING_SNAKE_CASE_							:				List[str]		=self.modulus(self.encrypt_key.dot(__A				)				).T.tolist()[
                         0
                     ]
                     SCREAMING_SNAKE_CASE_							:				List[Any]		=''''''.join(
                         self.replace_digits(__A				) for num in batch_encrypted				)
                     encrypted += encrypted_batch

              return encrypted


       def 	_snake_case				(    self				)						->    numpy.ndarray:
              SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=round(numpy.linalg.det(self.encrypt_key				)				)

              if det < 0:
                     SCREAMING_SNAKE_CASE_							:				Optional[Any]		=det % len(self.key_string				)
              SCREAMING_SNAKE_CASE_							:				List[Any]		=None
              for i in range(len(self.key_string				)				):
                     if (det * i) % len(self.key_string				) == 1:
                            SCREAMING_SNAKE_CASE_							:				List[str]		=i
                            break

              SCREAMING_SNAKE_CASE_							:				List[str]		=(
                  det_inv
                  * numpy.linalg.det(self.encrypt_key				)
                  * numpy.linalg.inv(self.encrypt_key				)
              )

              return self.to_int(self.modulus(__A				)				)





       def 	_snake_case				(    self						,       __A				)						->    str:
              SCREAMING_SNAKE_CASE_							:				int		=self.make_decrypt_key()
              SCREAMING_SNAKE_CASE_							:				Optional[Any]		=self.process_text(text.upper()				)
              SCREAMING_SNAKE_CASE_							:				Any		=''''''

              for i in range(0						,       len(__A				) - self.break_key + 1						,       self.break_key				):
                     SCREAMING_SNAKE_CASE_							:				List[str]		=text[i : i + self.break_key]
                     SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=[self.replace_letters(__A				) for char in batch]
                     SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=numpy.array([vec]				).T
                     SCREAMING_SNAKE_CASE_							:				str		=self.modulus(decrypt_key.dot(__A				)				).T.tolist()[0]
                     SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=''''''.join(
                         self.replace_digits(__A				) for num in batch_decrypted				)
                     decrypted += decrypted_batch

              return decrypted






def 							SCREAMING_SNAKE_CASE_	(					)			->						None:
       SCREAMING_SNAKE_CASE_							:				List[str]		=int(input('''Enter the order of the encryption key: '''				)				)
       SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=[]

       print('''Enter each row of the encryption key with space separated integers'''				)
       for _ in range(UpperCAmelCase_				):
              SCREAMING_SNAKE_CASE_							:				Tuple		=[int(UpperCAmelCase_				) for x in input().split()]
              hill_matrix.append(UpperCAmelCase_				)

       SCREAMING_SNAKE_CASE_							:				Optional[int]		=HillCipher(numpy.array(UpperCAmelCase_				)				)

       print('''Would you like to encrypt or decrypt some text? (1 or 2)'''				)
       SCREAMING_SNAKE_CASE_							:				Dict		=input('''\n1. Encrypt\n2. Decrypt\n'''				)
       if option == "1":
              SCREAMING_SNAKE_CASE_							:				List[Any]		=input('''What text would you like to encrypt?: '''				)
              print('''Your encrypted text is:'''				)
              print(hc.encrypt(UpperCAmelCase_				)				)
       elif option == "2":
              SCREAMING_SNAKE_CASE_							:				Any		=input('''What text would you like to decrypt?: '''				)
              print('''Your decrypted text is:'''				)
              print(hc.decrypt(UpperCAmelCase_				)				)


if __name__ == "__main__":
 import doctest

 doctest.testmod()

 main()


import torch

from diffusers import DPMSolverSDEScheduler
from diffusers.utils import torch_device
from diffusers.utils.testing_utils import require_torchsde

from .test_schedulers import SchedulerCommonTest


@require_torchsde
class 			lowercase_		(      A       ):
       __lowerCamelCase				       =						(DPMSolverSDEScheduler,)
       __lowerCamelCase				       =						1_0


       def 	_snake_case				(    self						,       **__A				)						->    Union[str, Any]:
              SCREAMING_SNAKE_CASE_							:				Optional[int]		={
                  '''num_train_timesteps''': 1_100,
                  '''beta_start''': 0.0_001,
                  '''beta_end''': 0.02,
                  '''beta_schedule''': '''linear''',
                  '''noise_sampler_seed''': 0,
              }

              config.update(**__A				)
              return config


       def 	_snake_case				(    self				)						->    Any:
              for timesteps in [10, 50, 100, 1_000]:
                     self.check_over_configs(num_train_timesteps=__A				)


       def 	_snake_case				(    self				)						->    Union[str, Any]:
              for beta_start, beta_end in zip([0.00_001, 0.0_001, 0.001]						,       [0.0_002, 0.002, 0.02]				):
                     self.check_over_configs(beta_start=__A						,       beta_end=__A				)


       def 	_snake_case				(    self				)						->    Tuple:
              for schedule in ["linear", "scaled_linear"]:
                     self.check_over_configs(beta_schedule=__A				)


       def 	_snake_case				(    self				)						->    List[str]:
              for prediction_type in ["epsilon", "v_prediction"]:
                     self.check_over_configs(prediction_type=__A				)


       def 	_snake_case				(    self				)						->    int:
              SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=self.scheduler_classes[0]
              SCREAMING_SNAKE_CASE_							:				List[str]		=self.get_scheduler_config()
              SCREAMING_SNAKE_CASE_							:				List[str]		=scheduler_class(**__A				)

              scheduler.set_timesteps(self.num_inference_steps				)

              SCREAMING_SNAKE_CASE_							:				int		=self.dummy_model()
              SCREAMING_SNAKE_CASE_							:				List[str]		=self.dummy_sample_deter * scheduler.init_noise_sigma
              SCREAMING_SNAKE_CASE_							:				int		=sample.to(__A				)

              for i, t in enumerate(scheduler.timesteps				):
                     SCREAMING_SNAKE_CASE_							:				List[Any]		=scheduler.scale_model_input(__A						,       __A				)

                     SCREAMING_SNAKE_CASE_							:				Dict		=model(__A						,       __A				)

                     SCREAMING_SNAKE_CASE_							:				Tuple		=scheduler.step(__A						,       __A						,       __A				)
                     SCREAMING_SNAKE_CASE_							:				str		=output.prev_sample

              SCREAMING_SNAKE_CASE_							:				Optional[int]		=torch.sum(torch.abs(__A				)				)
              SCREAMING_SNAKE_CASE_							:				List[str]		=torch.mean(torch.abs(__A				)				)

              if torch_device in ["mps"]:
                     assert abs(result_sum.item() - 167.47_821_044_921_875				) < 1e-2
                     assert abs(result_mean.item() - 0.2_178_705_964_565_277				) < 1e-3
              elif torch_device in ["cuda"]:
                     assert abs(result_sum.item() - 171.59_352_111_816_406				) < 1e-2
                     assert abs(result_mean.item() - 0.22_342_906_892_299_652				) < 1e-3
              else:
                     assert abs(result_sum.item() - 162.52_383_422_851_562				) < 1e-2
                     assert abs(result_mean.item() - 0.211_619_570_851_326				) < 1e-3


       def 	_snake_case				(    self				)						->    Dict:
              SCREAMING_SNAKE_CASE_							:				List[str]		=self.scheduler_classes[0]
              SCREAMING_SNAKE_CASE_							:				Optional[int]		=self.get_scheduler_config(prediction_type='''v_prediction'''				)
              SCREAMING_SNAKE_CASE_							:				List[Any]		=scheduler_class(**__A				)

              scheduler.set_timesteps(self.num_inference_steps				)

              SCREAMING_SNAKE_CASE_							:				Tuple		=self.dummy_model()
              SCREAMING_SNAKE_CASE_							:				Optional[Any]		=self.dummy_sample_deter * scheduler.init_noise_sigma
              SCREAMING_SNAKE_CASE_							:				Tuple		=sample.to(__A				)

              for i, t in enumerate(scheduler.timesteps				):
                     SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=scheduler.scale_model_input(__A						,       __A				)

                     SCREAMING_SNAKE_CASE_							:				str		=model(__A						,       __A				)

                     SCREAMING_SNAKE_CASE_							:				Any		=scheduler.step(__A						,       __A						,       __A				)
                     SCREAMING_SNAKE_CASE_							:				Tuple		=output.prev_sample

              SCREAMING_SNAKE_CASE_							:				Optional[int]		=torch.sum(torch.abs(__A				)				)
              SCREAMING_SNAKE_CASE_							:				Optional[int]		=torch.mean(torch.abs(__A				)				)

              if torch_device in ["mps"]:
                     assert abs(result_sum.item() - 124.77_149_200_439_453				) < 1e-2
                     assert abs(result_mean.item() - 0.16_226_289_014_816_284				) < 1e-3
              elif torch_device in ["cuda"]:
                     assert abs(result_sum.item() - 128.1_663_360_595_703				) < 1e-2
                     assert abs(result_mean.item() - 0.16_688_326_001_167_297				) < 1e-3
              else:
                     assert abs(result_sum.item() - 119.8_487_548_828_125				) < 1e-2
                     assert abs(result_mean.item() - 0.1_560_530_662_536_621				) < 1e-3


       def 	_snake_case				(    self				)						->    int:
              SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=self.scheduler_classes[0]
              SCREAMING_SNAKE_CASE_							:				Optional[Any]		=self.get_scheduler_config()
              SCREAMING_SNAKE_CASE_							:				List[str]		=scheduler_class(**__A				)

              scheduler.set_timesteps(self.num_inference_steps						,       device=__A				)

              SCREAMING_SNAKE_CASE_							:				int		=self.dummy_model()
              SCREAMING_SNAKE_CASE_							:				int		=self.dummy_sample_deter.to(__A				) * scheduler.init_noise_sigma

              for t in scheduler.timesteps:
                     SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=scheduler.scale_model_input(__A						,       __A				)

                     SCREAMING_SNAKE_CASE_							:				Dict		=model(__A						,       __A				)

                     SCREAMING_SNAKE_CASE_							:				Optional[Any]		=scheduler.step(__A						,       __A						,       __A				)
                     SCREAMING_SNAKE_CASE_							:				List[Any]		=output.prev_sample

              SCREAMING_SNAKE_CASE_							:				List[Any]		=torch.sum(torch.abs(__A				)				)
              SCREAMING_SNAKE_CASE_							:				int		=torch.mean(torch.abs(__A				)				)

              if torch_device in ["mps"]:
                     assert abs(result_sum.item() - 167.46_957_397_460_938				) < 1e-2
                     assert abs(result_mean.item() - 0.21_805_934_607_982_635				) < 1e-3
              elif torch_device in ["cuda"]:
                     assert abs(result_sum.item() - 171.59_353_637_695_312				) < 1e-2
                     assert abs(result_mean.item() - 0.22_342_908_382_415_771				) < 1e-3
              else:
                     assert abs(result_sum.item() - 162.52_383_422_851_562				) < 1e-2
                     assert abs(result_mean.item() - 0.211_619_570_851_326				) < 1e-3





       def 	_snake_case				(    self				)						->    List[Any]:
              SCREAMING_SNAKE_CASE_							:				Union[str, Any]		=self.scheduler_classes[0]
              SCREAMING_SNAKE_CASE_							:				List[str]		=self.get_scheduler_config()
              SCREAMING_SNAKE_CASE_							:				Dict		=scheduler_class(**__A						,       use_karras_sigmas=__A				)

              scheduler.set_timesteps(self.num_inference_steps						,       device=__A				)

              SCREAMING_SNAKE_CASE_							:				Dict		=self.dummy_model()
              SCREAMING_SNAKE_CASE_							:				List[Any]		=self.dummy_sample_deter.to(__A				) * scheduler.init_noise_sigma
              SCREAMING_SNAKE_CASE_							:				str		=sample.to(__A				)

              for t in scheduler.timesteps:
                     SCREAMING_SNAKE_CASE_							:				Any		=scheduler.scale_model_input(__A						,       __A				)

                     SCREAMING_SNAKE_CASE_							:				Optional[Any]		=model(__A						,       __A				)

                     SCREAMING_SNAKE_CASE_							:				int		=scheduler.step(__A						,       __A						,       __A				)
                     SCREAMING_SNAKE_CASE_							:				List[str]		=output.prev_sample

              SCREAMING_SNAKE_CASE_							:				str		=torch.sum(torch.abs(__A				)				)
              SCREAMING_SNAKE_CASE_							:				List[Any]		=torch.mean(torch.abs(__A				)				)

              if torch_device in ["mps"]:
                     assert abs(result_sum.item() - 176.66_974_135_742_188				) < 1e-2
                     assert abs(result_mean.item() - 0.23_003_872_730_981_811				) < 1e-2
              elif torch_device in ["cuda"]:
                     assert abs(result_sum.item() - 177.63_653_564_453_125				) < 1e-2
                     assert abs(result_mean.item() - 0.23_003_872_730_981_811				) < 1e-2
              else:
                     assert abs(result_sum.item() - 170.3_135_223_388_672				) < 1e-2
                     assert abs(result_mean.item() - 0.23_003_872_730_981_811				) < 1e-2
