Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 使求和幂级数更有效_Python 2.7_Math_Modulus - Fatal编程技术网

Python 2.7 使求和幂级数更有效

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

我使用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*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