def 			A_   ( _lowerCamelCase			:							Dict  ,  _lowerCamelCase			:							List[Any]  ,  _lowerCamelCase			:							Union[str, Any]    ):

      if power < 0:
            return -1
      base %= mod
      _lowerCAmelCase		   =   1

      while power > 0:
            if power & 1:
                  _lowerCAmelCase		   =   (result * base) % mod
            _lowerCAmelCase		   =   power >> 1
            _lowerCAmelCase		   =   (base * base) % mod

      return result







def 			A_   ( ):
      print(modular_exponential(3  ,  200  ,  13    )    )


if __name__ == "__main__":
 import doctest

 doctest.testmod()

 main()






'''simple docstring'''




from __future__ import annotations







def 			A_   ( _lowerCamelCase			:							str  ,  _lowerCamelCase			:							dict[str, str]    ):
      _lowerCAmelCase   ,  _lowerCAmelCase   ,  _lowerCAmelCase		   =   '', '', ''
      _lowerCAmelCase		   =   []

      for character in message_part:
            tmp.append(character_to_number[character]    )

      for each in tmp:
            one += each[0]
            two += each[1]
            three += each[2]

      return one + two + three







def 			A_   ( _lowerCamelCase			:							str  ,  _lowerCamelCase			:							dict[str, str]    ):
      _lowerCAmelCase   ,  _lowerCAmelCase		   =   '', ''
      _lowerCAmelCase		   =   []

      for character in message_part:
            this_part += character_to_number[character]

      for digit in this_part:
            tmp += digit
            if len(_lowerCamelCase    ) == len(_lowerCamelCase    ):
                  result.append(_lowerCamelCase    )
                  _lowerCAmelCase		   =   ''

      return result[0], result[1], result[2]







def 			A_   ( _lowerCamelCase			:							str  ,  _lowerCamelCase			:							str    ):
      # Validate message and alphabet, set to upper and remove spaces
      _lowerCAmelCase		   =   alphabet.replace(' '  ,  ''    ).upper()
      _lowerCAmelCase		   =   message.replace(' '  ,  ''    ).upper()

      # Check length and characters
      if len(_lowerCamelCase    ) != 27:
            raise KeyError('Length of alphabet has to be 27.'    )
      for each in message:
            if each not in alphabet:
                  raise ValueError('Each message character has to be included in alphabet!'    )

    # Generate dictionares
      _lowerCAmelCase		   =   (
          '111',
          '112',
          '113',
          '121',
          '122',
          '123',
          '131',
          '132',
          '133',
          '211',
          '212',
          '213',
          '221',
          '222',
          '223',
          '231',
          '232',
          '233',
          '311',
          '312',
          '313',
          '321',
          '322',
          '323',
          '331',
          '332',
          '333',
      )
      _lowerCAmelCase		   =   {}
      _lowerCAmelCase		   =   {}
      for letter, number in zip(_lowerCamelCase  ,  _lowerCamelCase    ):
            _lowerCAmelCase		   =   number
            _lowerCAmelCase		   =   letter

      return message, alphabet, character_to_number, number_to_character







def 			A_   ( _lowerCamelCase			:							str  ,  _lowerCamelCase			:							str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ."  ,  _lowerCamelCase			:							int = 5    ):
      _lowerCAmelCase   ,  _lowerCAmelCase   ,  _lowerCAmelCase   ,  _lowerCAmelCase		   =   __prepare(
          _lowerCamelCase  ,  _lowerCamelCase    )
      _lowerCAmelCase   ,  _lowerCAmelCase		   =   '', ''

      for i in range(0  ,  len(_lowerCamelCase    ) + 1  ,  _lowerCamelCase    ):
            encrypted_numeric += __encrypt_part(
                message[i : i + period]  ,  _lowerCamelCase    )

      for i in range(0  ,  len(_lowerCamelCase    )  ,  3    ):
            encrypted += number_to_character[encrypted_numeric[i : i + 3]]

      return encrypted







def 			A_   ( _lowerCamelCase			:							str  ,  _lowerCamelCase			:							str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ."  ,  _lowerCamelCase			:							int = 5    ):
      _lowerCAmelCase   ,  _lowerCAmelCase   ,  _lowerCAmelCase   ,  _lowerCAmelCase		   =   __prepare(
          _lowerCamelCase  ,  _lowerCamelCase    )
      _lowerCAmelCase		   =   []
      _lowerCAmelCase		   =   ''

      for i in range(0  ,  len(_lowerCamelCase    ) + 1  ,  _lowerCamelCase    ):
            _lowerCAmelCase   ,  _lowerCAmelCase   ,  _lowerCAmelCase		   =   __decrypt_part(message[i : i + period]  ,  _lowerCamelCase    )

            for j in range(0  ,  len(_lowerCamelCase    )    ):
                  decrypted_numeric.append(a[j] + b[j] + c[j]    )

      for each in decrypted_numeric:
            decrypted += number_to_character[each]

      return decrypted


if __name__ == "__main__":
 snake_case  =			'''DEFEND THE EAST WALL OF THE CASTLE.'''
 snake_case  =			encrypt_message(msg, '''EPSDUCVWYM.ZLKXNBTFGORIJHAQ''')
 snake_case  =			decrypt_message(encrypted, '''EPSDUCVWYM.ZLKXNBTFGORIJHAQ''')
 print(f'''Encrypted: {encrypted}\nDecrypted: {decrypted}''')





