#!/usr/bin/env python """ This Python script searches for powers whose decimal expansions do not contain any zero digits. It accepts up to four optional arguments. Arguments: base: the base of exponents (default is 5) max_iter: largest exponent to check (default is 10**6) digits: initial number of digits to check (default is 60) start: first exponent to check (default is 0) Output: The program prints the exponents n for which the decimal expansion of base**n does not contain any zero digits. One number is printed on each line. If the program is interrupted by pressing Ctrl-C, then the current value of the exponent n will be displayed, allowing you to restart the search where you left off. Caveat: It is extremely unlikely that a power with millions of digits will have no zero digits. However, if this should occur, then the program may crash. """ import sys import signal from math import log10 def has_zero_digit(n): return '0' in str(n) def verify(n, base, power, digits, max_power): if not has_zero_digit(power): log = n * log10(base) while digits <= log: digits *= 2 max_power *= max_power power = pow(base, n, max_power) if has_zero_digit(power): return print (n) def search(base, max_iter, digits, start): global n max_power = 10 ** digits n = start if start * log10(base) < digits: power = base ** start while power < max_power: if not has_zero_digit(power): print (n) power *= base n += 1 power = power % max_power else: power = pow(base, start, max_power) while n <= max_iter: verify(n, base, power, digits, max_power) power = (power * base) % max_power n += 1 def exit_gracefully(signum, frame): print ('Interrupted at n = %d' % n) sys.exit(1) if __name__ == '__main__': base = 5 max_iter = 10**6 digits = 60 start = 0 n = 0 num_args = len(sys.argv) if num_args > 1: base = int(sys.argv[1]) if num_args > 2: max_iter = int(sys.argv[2]) if num_args > 3: digits = int(sys.argv[3]) if num_args > 4: start = int(sys.argv[4]) signal.signal(signal.SIGINT, exit_gracefully) search(base, max_iter, digits, start)