code: def discrete_log(element, generator, generator_order, generator_order_decomposition, modulus):
          
          if pow(element, generator_order, modulus) != 1:
              # logger.debug('Powmod not one')
              return None
  
          moduli = []
          remainders = []
          for prime, power in list(generator_order_decomposition.items()):
              prime_to_power = prime ** power
              order_div_prime_power = generator_order // prime_to_power  # g.div(generator_order, prime_to_power)
              g_dash = pow(generator, order_div_prime_power, modulus)
              h_dash = pow(element, order_div_prime_power, modulus)
              found = False
              for i in range(0, prime_to_power):
                  if pow(g_dash, i, modulus) == h_dash:
                      remainders.append(i)
                      moduli.append(prime_to_power)
                      found = True
                      break
              if not found:
                  # logger.debug('Not found :(')
                  return None
  
          ccrt = DlogFprint.chinese_remainder(moduli, remainders)
          return ccrt
docs: Simple discrete logarithm
          :param element:
          :param generator:
          :param generator_order:
          :param generator_order_decomposition:
          :param modulus:
          :return: