[关闭]
@Lin-- 2018-09-17T07:16:40.000000Z 字数 1539 阅读 292

第三次作业

计算机数学


1.GCD迭代版

  1. #欧几里得算法
  2. #迭代
  3. def gcd(a,b):
  4. while b!=0:
  5. y=b
  6. b=a%b
  7. a=y
  8. return a

2.验证EGCD算法正确性

  1. def egcd(a,b):
  2. r0,r1,s0,s1=1,0,0,1
  3. while b:
  4. q,a,b=a//b,b,a%b
  5. r0,r1=r1,r0-q*r1
  6. s0,s1=s1,s0-q*s1
  7. return a,r0,s0

证:

返回值a是a与b最大公倍数,r0,s0分别为等式 的系数,
根据欧几里得算法有


上述代码运算过程为:


由矩阵运算法则得 (这个我真不会算)

......


以此循环,当b=0时停止。
得到a为gcd的值,r0,s0为方程 的一组解。


3.编程实现同余式的求解。给定同余式 ax = b (mod N),即给定整数a、b和N,求x。如果无解,也要给出“无解”的提示。

  1. #a*x=N*y1+p(p是余数) ①;b=N*y2+p(p是余数) ②
  2. #有p=b-N*y2;带入①式a*x=N*y1+b-N*y2;得:a*x-(y1+y2)*N=b,即a*x+y*N=b;
  3. #b必为gcd(a,N)的倍数,否则,等式同除以gcd(a,N),则等式右边不为整数。
  4. #故若b不是gcd(a,N)的倍数,则无解
  5. #将上述等式化为a*x'+N*y'=gcd(a,N);则x=x'*(b/gcd(a,N))
  6. def gcd(a,b):
  7. if b==0:
  8. return a
  9. else:
  10. return gcd(b,a%b)
  11. def f(a,b,N):
  12. if b%gcd(a,N)!=0:
  13. print("NO SOLUTION!")
  14. return 0
  15. else:
  16. r0,r1,s0,s1=1,0,0,1
  17. while N:
  18. q,a,N=a//N,N,a%N
  19. r0,r1=r1,r0-q*r1
  20. s0,s1=s1,s0-q*s1
  21. return r0*(b/gcd(a,N))

4. 编程实现求乘法逆元。给定同余式 ax = (1 mod N),即给定整数a和N,求x。如果无解,也要给出“无解”的提示。

  1. #由上题可知,ax=(1 mod N)可写为:ax+yN=1。
  2. #条件:a与N互质。
  3. #否则,若a与N不互质,则必存在不为1的整数c为a与N的最大公约数。
  4. #那么,提取c,移至等式右边,得1/c,不为整数,无解。故a与N需互质。
  5. #由于a与N互质,则gcd(a,N)=1;故ax+yN=1=gcd(a,N),求x
  6. def gcd(a,b):
  7. if b==0:
  8. return a
  9. else:
  10. return gcd(b,a%b)
  11. def f(a,N):
  12. if gcd(a,N)!=1:
  13. print("NO SOLUTION!")
  14. return 0
  15. else:
  16. r0,r1,s0,s1=1,0,0,1
  17. while N:
  18. q,a,N=a//N,N,a%N
  19. r0,r1=r1,r0-q*r1
  20. s0,s1=s1,s0-q*s1
  21. return r0
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注