Python 2.7 使求和幂级数更有效
我使用hackerrank编写代码,遇到了以下问题: 我的代码适用于小文件和大数字。至于大文件,它超时了。有人能让它更有效率吗 我的代码:Python 2.7 使求和幂级数更有效,python-2.7,math,modulus,Python 2.7,Math,Modulus,我使用hackerrank编写代码,遇到了以下问题: 我的代码适用于小文件和大数字。至于大文件,它超时了。有人能让它更有效率吗 我的代码: z = [] def modexp(a, n, m): bits = [] while n: bits.append(n%2) n /= 2 solution = 1 bits.reverse() for x in bits: solution = (solution
z = []
def modexp(a, n, m):
bits = []
while n:
bits.append(n%2)
n /= 2
solution = 1
bits.reverse()
for x in bits:
solution = (solution*solution)%m
if x:
solution = (solution*a)%m
return solution
for _ in xrange(int(input())):
while True:
try:
x = raw_input()
sum =0
z = x.split(' ')
power = int(z[1])
limit = int(z[0])
for i in range(0,limit+1):
sum = sum%100 + modexp(i%100,power, pow(10,2))
if sum < 10:
print '%02d' % sum
if sum > 10:
print sum%100
except:
break
样本输出:
76
13
76
75
24
51
20
54
90
42
通过观察其值mod 100的周期为100,可以很容易地减少功率评估的数量。因此 通过计算
M=K/100分解K=M*100+L
;L=K%100代码>
然后
- 对于
k=0
到L
的情况,电源modexp(k%100,N,100)
发生M+1次
- 对于
k=L+1
到99
,它在总和中出现M
次李>
因此,每个幂和可以减少到99次幂计算
通过观察相同数字的递增幂在最后两位数中是周期性的,可以进一步减少计算幂的工作量。通常是顺序
1, a % m, a**2 % m, a**3 % m, a**4 % m, ...
在素数因子的最高重数给出的某个点之后变为周期性。一个周期长度由Euler Toticent函数中的m
值给出
100=2²·5²
的总值为phi(100)=(2-1)·2·(5-1)·5=40
。设置周期之前的偏移量最多为2,因此对于所有整数a
a**2 % 100 == a**42 % 100 = a**82 % 100 = ...
a**3 % 100 == a**43 % 100 = a**83 % 100 = ...
等等
这意味着对于N>41
可以将指数降低到N=2+(N-2)%40
。(事实上,在这种减少中,可以用20
代替40
。)
最后一句话不会对运行时间产生太大影响,只会影响代码的复杂性:
有一种较短的方法可以实现modexp
,该算法也是识别循环不变量的标准练习:
def modexp(a, n, m):
solution = 1
apower = a
while n:
if (n%2): solution = (solution*apower) % m
n /= 2
apower = (apower*apower) % m
return solution
这不应该是你的练习吗?请你解释一下,因为我很困惑。
def modexp(a, n, m):
solution = 1
apower = a
while n:
if (n%2): solution = (solution*apower) % m
n /= 2
apower = (apower*apower) % m
return solution