[关闭]
@Lin-- 2018-10-03T05:55:58.000000Z 字数 514 阅读 527

作业六:从乘法到指数运算

计算机数学


题目:我们第一个作业是让大家做两个整数相乘,看上去非常没有意义,其实过程非常有启发性。从这个思路出发,我们可以有一种快速的求指数的算法。即,给定整数a、x和n,求a的x次方mod n。请实现一种快速求指数的算法(命名为pow)。


递归

  1. #递归
  2. #求指数
  3. def f(a,x):
  4. #递归终止条件
  5. if x==1: return a
  6. #x是偶数时,即求a的偶数次幂
  7. if x%2==0:
  8. #分解为等分的左右两个子问题
  9. return f(a,x//2)*f(a,x//2)
  10. #x是奇数时,即求a的奇数次幂
  11. if x%2!=0:
  12. #分解为左边偶数个a相乘(x//2)和右边奇数个a相乘((x//2)+1)
  13. return f(a,x//2)*f(a,(x//2)+1)
  14. #取模运算
  15. def Pow(a,x,n):
  16. return f(a,x)%n
  17. #测试
  18. print(Pow(2,10,17))

迭代

  1. #迭代
  2. def Pow(a,x,n):
  3. result=1
  4. while(x!=0):
  5. #判断x是否为奇数,若是,则result乘以单独的一个a
  6. if(x%2):
  7. result*=a
  8. #x减半
  9. x=x//2
  10. #求a平方
  11. a*=a
  12. return result%n
  13. print(Pow(2,10,17))
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注