2021SC@SDUSC

本章综述

大整数ZZ类主要实现了任意长度大整数表示、最大公因数、Jacobi符号和素性检验。笔者将通过逐个分析ZZ.cpp源代码中函数的形式来一步步向读者展示NTL是如何实现上述功能的。

计算最大公因数(gcd)

(1)数学基础:(广义)欧几里得除法

知识储备(定理,公立,公式)

·如果 b|a ,则(a,b) = b;

·如果a,b为两整数,则(a,b) = (b,a)

·如果 p为素数,a为整数,且p  a,则a和p互素

证明:设(a,p) = d ,则有d|p,且d|a 。因为p是素数,所以d = 1或者d = p

对于d = p ,和p  a矛盾,所以d = 1,即,(a,p) = 1.结论成立

·设b为任意正整数,(0,b) = b

·设a,b,c≠0且为整数。若c|a,c|b,则c|(sa+tb)。(若c|a,c|b,则c整除a,b的任意线性组合)

证明:s*a+t*b  = s*θ*c+t*β*c = c*(s* θ+t* β)

·设a,b,c为三个不全为零的整数,如果a = q*b+c,其中q为整数,则(a,b) = (b,c)

证明:d = (a,b) ,=> d|a,d|b  =>d|(a+(-q)b)  =>d|c  ,d|b   =>d为b,c的公因数 =>d≤d1

d1 = (b,c),同理得:d1≤d。=>d1=d  =>(a,b) = (b,c)

广义欧几里得除法:

欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。扩展欧几里得算法可用于RSA加密等领域。

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:

1997 / 615 = 3 (余 152)

615 / 152 = 4(余7)

152 / 7 = 21(余5)

7 / 5 = 1 (余2)

5 / 2 = 2 (余1)

2 / 1 = 2 (余0)

至此,最大公约数为1

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

(2)代码分析:

广义欧几里得除法求最大公因数

long GCD(long a, long b){long u, v, t, x;if (a < 0) {if (a < -NTL_MAX_LONG) ResourceError("GCD: integer overflow");a = -a;                    //判断输入的长整型是否溢出}if (b < 0) {if (b < -NTL_MAX_LONG) ResourceError("GCD: integer overflow");b = -b;                   //判断输入的长整型是否溢出}if (b==0)x = a;else {u = a;v = b;do {t = u % v;       //a = qb+r欧几里得核心算法(详见上知识储备-广义欧几里得除法)u = v;v = t;} while (v != 0);x = u;}return x;}

贝祖公式(广义欧几里得的逆方法)

利用广义欧几里得的算法步骤一步步回溯,就可以找到这样一组(x,y)(详细代码见@元解~殇怀)

·贝祖公式:

求s,t的一种方法也是简单方法:是利用广义欧几里得除法先得到(a,b) 即a,b的最大公因数,然后回代得到整数s,t。

2.2.4关于模运算

数学基础:乘法逆元求解

如下例:

乘法逆元:已知A和N互素,则存在一个整数B,使得A*B=1(mod N)

利用广义欧几里得除法(辗转相除法)对余数N进行辗转相除,然后将商逆序排列(如上图第一行黑色字),然后利用贝祖公式的变形求出上图第三行的相关数据(其中第三行第一的数字永远为1,第二个数字和第一行的第一个数字一样),如:5 = 1+1*4 ;9 = 4+5*1 ;14 = 5+9*1 ;23 = 9+14*1 ;37 = 14+23*1 ……

最后求出550即为550关于模1769的乘法逆元,即(550*550)mod 1769 = 1。

long InvModStatus(long& x, long a, long n)  //求a关于n的乘法逆元,并将其赋给X。同时返回a和ns是否互素。{long d, s, t;XGCD(d, s, t, a, n);if (d != 1) {x = d;return 1;}else {if (s < 0)x = s + n;                      //规定乘法逆元要是正的,如果求出来不是正数,则要加上一倍的n转成正数输出elsex = s;return 0;}}long InvMod(long a, long n){long d, s, t;XGCD(d, s, t, a, n);if (d != 1) {InvModError("InvMod: inverse undefined");}if (s < 0)return s + n;elsereturn s;}long PowerMod(long a, long ee, long n){long x, y;unsigned long e;if (ee < 0)e = - ((unsigned long) ee);elsee = ee;x = 1;y = a;while (e) {if (e & 1) x = MulMod(x, y, n);   //算法加速,一次循环,两次计算乘积,通过右移指令和按位取与指令做到快速的循环迭代,减少循环次数,加快运算速度。//利用公式:((a{x} mod n)*(a{y} mod n))mod n = a{x+y} mod n  ---证明见后y = MulMod(y, y, n);e = e >> 1;}if (ee < 0) x = InvMod(x, n);return x;}

证明:((a{x} mod n)*(a{y} mod n))mod n = a{x+y} mod n

原式左侧 = ((a{x}-k1*n)*(a{y}-k2*n))mod n

         = (a{x+y}-n(k2* a{x}+k1* a{y})+n{2}*k1*k2)mod n

        = (a{x+y}) mod n

NTL密码算法开源库——大整数ZZ类(一)相关推荐

  1. NTL密码算法开源库-大整数ZZ类(一)

    2021SC@SDUSC NTL密码算法开源库-大整数ZZ类(一) 本章综述 代码分析 贝祖公式 本章综述 大整数ZZ类主要实现了任意长度大整数表示.最大公因数.Jacobi符号和素性检验.笔者将通过 ...

  2. NTL密码算法开源库-大整数ZZ类(三)

    2021SC@SDUSC NTL密码算法开源库-大整数ZZ类(三) 中国剩余定理 一次同余式 乘法逆元 简化剩余的等价描述 二次同余式 雅可比符号 中国剩余定理 //中国剩余定理模板代码 typede ...

  3. NTL密码算法开源库——大整数ZZ类(四)

    2021SC@SDUSC RSA算法原理 密钥生成的步骤 第一步,随机选择两个不相等的质数p和q. 爱丽丝选择了61和53.(实际应用中,这两个质数越大,就越难破解.) 第二步,计算p和q的乘积n. ...

  4. NTL密码算法开源库——大整数ZZ类(二)

    2021SC@SDUSC 素数检测 (1)数学基础:费马小定理,二次探测定理,欧拉定理,Miller-Rabin素数测试,同余式, wilson定理,乘法逆元,简化剩余系 费马小定理:若存在整数 a ...

  5. NTL密码算法开源库——大整数上多项式(ZZX,GF2X)

    2021SC@SDUSC 大整数上多项式(ZZX,GF2X) GF(2)域求两多项式的最大公因式 扩展欧几里得求两多项式最大公因式 GF(2)域求两多项式的最大公因式 //在GF(2)域中求两多项式的 ...

  6. NTL密码算法开源库--综述

    2021SC@SDUSC NTL密码算法开源库--综述 项目综述 NTL算法库是开放源码的自由软件,具有专业处理任意精度大整数.实数的计算数论与计算代数的高性能可移植c++库,提供了任意大整数.任意精 ...

  7. NTL密码算法开源库(数论库)代码分析项目--综述

    2021SC@SDUSC NTL密码算法开源库(数论库)代码分析项目--综述 项目综述 NTL开源代码库的安装和使用 NTL代码开源库主要解决的问题 项目分工以及核心代码的分配 项目综述 NTL算法库 ...

  8. 【NTL密码算法开源库-概述】

    NTL库基本数据类型 ZZ: big integers(支持不等式运算) ZZ_p: big integers modulo p zz_p: integers mod "single pre ...

  9. NTL密码算法开源库——模二整数上的矩阵(mat_GF2)

    2021SC@SDUSC 模二整数上的矩阵(mat_GF2) 矩阵运算 高斯消元 矩阵运算 具体代码 #include <NTL/matrix.h> #include <NTL/ve ...

最新文章

  1. 由于不知线程池的bug,某Java程序员叕被祭天
  2. C02-程序设计基础提高班(C++)第7周上机任务-指针
  3. 解决win下安装wordcloud出错问题
  4. 远控免杀专题(21)-HERCULES免杀
  5. hdu1232畅通路程(并查集)
  6. sqlite排序规则
  7. s5pv210时钟系统详解
  8. 汉字转拼音函数SQLSERVER数据库
  9. AI提取图片里包含的文字信息-解决文字无法复制的痛点
  10. matlab黄金分割法
  11. 【转】常见蓝屏错误信息
  12. iis ftp服务器修改端口号,iis ftp服务器指定端口
  13. Android手机刷入Magisk的方法
  14. 在WSL上编译并运行全志XR806的完全体demo
  15. [python] 4.比心
  16. 转载:理解 VSync
  17. 3.7 使用吸管和颜色取样器工具 [Ps教程]
  18. OFFICE EXCEL WORD 安装程序正准备必要文件处理方法
  19. 点云地图PCL转换成为八叉树地图octomap
  20. 设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积

热门文章

  1. 计算机任务管理器设置软件启动,电脑软件开机自动启动,教你一招禁止启动,能够有效提升开机速度...
  2. 软件测试自学怎么学?
  3. 12-Web安全—基于SQL Server的报错注入——and,conver,cast
  4. Kafka集群搭建过程(kafka2.5+eagle)
  5. unrar file.rar 解压rar 问题,找不到unrar 命令。安装rar unrar流程及bug处理
  6. 基于python的 ping 网络状态监测方法 亲测有效
  7. vb.net如何查询电脑麦克风收到声音_拔掉 MacBook,用 8GB 树莓派来办公的体验如何?...
  8. 苹果自带的清理软件_软件| 卸载软件、清理文件,你只需Revo Uninstaller Pro(自带注册程序)...
  9. ios VM snapshot invalid and could not be inferred from settings
  10. 第一篇博客-Sql排名函数DENSE_RANK