2021SC@SDUSC

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

  • 中国剩余定理
  • 一次同余式
  • 乘法逆元
  • 简化剩余的等价描述
  • 二次同余式
  • 雅可比符号

中国剩余定理

//中国剩余定理模板代码
typedef long long ll;
ll china(ll a[],ll b[],int n)//a[]为除数,b[]为余数
{ll M=1,y,x=0;for(int i=0;i<n;++i)  //算出它们累乘的结果M*=a[i];for(int i=0;i<n;++i){ll w=M/a[i];ll tx=0;int t=exgcd(w,a[i],tx,y);  //计算逆元x=(x+w*(b[i]/t)*x)%M; }return (x+M)%M;
}

具体数学原理证明见@回首~阑珊

一次同余式

设m是正整数,a是满足ma的整数.则一次同余式
ax≡1(mod m)
有解的充分必要条件是(a,m)=1.而且,当同余式(3)有解时,解是惟一的
证充分性.(存在性)因为(a,m)=1,根据广义欧几里得除法
可找到整数s,t使得
s · a + t · m = (a,m) = 1.
因此,x=s(modm)是同余式(3)的解(惟一性)若还有解x1,即ax1=1(modm),则有
a(x – x1 ) ≡ 0 (mod m)
因为(a,m)=1,所以x1≡x(modm).解是惟一的
再证必要性:若同余式(3)有解x≡xo(modm),则存在整数q,使得a·x0=1+q·m.根据定理有(a,m)=1.定理成立.证毕

乘法逆元

定义3.1.2设m是一个正整数,a是一个整数.如果存在整数a′使得
a · a 0 ≡ a 0 · a ≡ 1 (mod m)
成立,则a叫做模m可逆元
根据定理,在模m的意义下,a′是惟一存在的.这时a叫做a
的模m逆元,记作
a 0 = a −1 (mod m).
因此,在定理的条件下,同余式(3)即
ax≡1(modm)的解可写成x ≡ a ^(−1) (mod m).

简化剩余的等价描述

设m是一个正整数.则整数a是模m简化剩余的充要条件是整数α是模m逆元
证:必要性.如果整数α是模m简化剩余,则(a,m)=1.根据定
理,存在整数a′使得
a · a 0 ≡ a 0 · a ≡ 1 (mod m).
因此,a是模m逆元
充分性.如果α是模m逆元,则存在整数α′使得
a · a 0 ≡ 1 (mod m).
即同余式
ax≡1(modm)
有解x≡a(modm).又有(a,m)=1.因此,整数a是
模m简化剩余.

最后,考虑通常的一次同余式的求解
设m是一个正整数,a是满足m不整除a的整数,则一次同余式
ax ≡ b (mod m)
有解的充分必要条件是(a,m)|b.而且,当同余式有解时,其解



二次同余式

求解形如 x^2 = a (mod p) 这样的同余式
代码:

/*
模P平方根:求 X ^2 = a (mod p)定理:当P为奇素数的时候先判断(a / p )的勒让德符号, 若为-1则无解,若为1则有解分解P-1,然后求B,然后求出X(t-1),和a的逆元然后开始求 ans = ( a的逆元 * 上一个X的平方(t-k))的(t-k-1)次方对P取模如果  ans == -1 则 J = 1;如果  ans ==  1 则 J = 0;然后开始求现在的 X = (上一个X * B的(J*2的k次方)次方直到求出X0,也就是最后的解
*/
#include<bits/stdc++.h>
using namespace std;void Divide(int p, int &t, int &s)
{t = 0, s= 0;while(p % 2 == 0){t++;p /= 2;}s = p;return ;
}int Pow(int a, int b, int mod)
{int ans = 1, base = a;while(b != 0){if(b & 1)ans = (ans * base) % mod;base = (base * base) % mod;b >>= 1;}return ans;
}int Legendre(int a, int p)
{if(a == 2){int x = (p+1)*(p-1)/8;if(x % 2 == 0)return 1;elsereturn -1;}else{int ans = Pow(a, (p-1)/2, p);if(ans == p-1)return -1;elsereturn 1;}
}int FindN(int p)
{for(int i = 1; i < p; i++){if(Legendre(i, p) == -1)return i;}
}int e_gcd(int a, int b, int &x, int &y)
{if(b == 0){x = 1; y = 0;return a;}int q = e_gcd(b, a%b, y, x);y -= a/b*x;return q;
}int Inverse(int a, int m)
{int x, y;int gcd = e_gcd(a, m, x, y);if(1 % gcd != 0)return -1;x *= 1/gcd;m = abs(m);int ans = x % m;if(ans <= 0)ans += m;return ans;
}int JudgeJ(int A, int x, int t, int p)
{cout << A << " " << x << " " << t << " " << p << endl;x = ((x % p) * (x % p) % p);int xx = (A * x) % p;int ans = Pow(xx, pow(2, t), p);if(ans == p-1)return 1;elsereturn 0;
}int main()
{int a, p;printf("请输入所求算式的 a 和 p:\n");while( scanf("%d %d", &a, &p) != EOF){if(Legendre(a, p) == -1){cout << "无解" << endl;continue;}int t, s;Divide(p-1, t, s); //求t和sint n = FindN(p);  //找到那个不符合条件的nint b = Pow(n, s, p);int *X;X = (int *) malloc(sizeof(int) * (t+5));X[t-1] = Pow(a, (s+1)/2, p);t--;int A = Inverse(a, p);          //求A的逆元int k = 0;while(t > 0){int j = JudgeJ(A, X[t], t-1, p);int B = Pow(b, j * pow(2, k), p);X[t-1] = ((X[t] % p) * (B % p)) % p;t--; k++;}printf("所求的解为:");cout << X[0] << endl;}return 0;
}

雅可比符号

long Jacobi(const ZZ& aa, const ZZ& nn)
{ZZ a, n;long t, k;long d;a = aa;n = nn;t = 1;while (a != 0) {k = MakeOdd(a);d = trunc_long(n, 3);if ((k & 1) && (d == 3 || d == 5)) t = -t;if (trunc_long(a, 2) == 3 && (d & 3) == 3) t = -t;swap(a, n);rem(a, a, n);}if (n == 1)return t;elsereturn 0;
}

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

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

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

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

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

  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. java jni调用dll文件_Java通过jni调用动态链接库
  2. UpdatePanel中用后台调用Javascript
  3. SAP UI5 get route - local version VS central version
  4. 蒋金楠:200行代码7个对象《ASP.NET Core框架揭密》苏州.NET俱乐部课程分享
  5. 魔界的青蔷薇也能在人间开放了
  6. C语言信息系统贴吧,急 c语言学生信息管理系统
  7. 7-Arco大讲堂(二)
  8. Delphi 两种类的声明方法
  9. 贝壳找房的深度学习模型迭代及算法优化
  10. 人的大脑是如何识别运动物体
  11. excel做地图热力图_如何用excel制作中国地图热力数据图
  12. java毕业设计_基于java的毕业设计
  13. 移动通信-WCDMA物理信道
  14. 真相了!他说:码农和程序员的区别就在这!网友炸锅了
  15. IT行业发展趋势及就业前景?
  16. 嵌入式Linux开发板_WIFI无线网卡驱动移植
  17. 从废弃塑料瓶到鼠标,微软海洋环保鼠标背后不一般的工程实践
  18. 苏大计算机学院在哪,苏州大学计算机技术学院导师介绍:纪其进
  19. nginx fastcgi_buffers设置
  20. Sql server语句(增删改查)

热门文章

  1. 图书管理系统需求规格说明文档目录_一个已经超越普通设计素材管理范畴的文档管理软件—Eagle...
  2. openssl 1.0.2k-fips 升级到 openssl-3.0.5
  3. 怎样识别app网站服务器在国外,APP服务器你了解多少?什么是海外app服务器
  4. aspose.words复制插入同一word文档中的某个页面
  5. IT行业产品经理和项目经理的区别?
  6. sequence-数据库-sjk
  7. 好文:练习一万小时成天才?(by同人于野)
  8. n阶乘计算器 超大数 理论可计算8位数以内的阶乘数
  9. 未来计算机手抄报图片,【科技与未来手抄报图片大全】未来科技手抄报图片_科技创造未来手抄报设计_亲亲宝贝网...
  10. html超链接几种写法