NTL密码算法开源库-大整数ZZ类(三)
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类(三)相关推荐
- NTL密码算法开源库-大整数ZZ类(一)
2021SC@SDUSC NTL密码算法开源库-大整数ZZ类(一) 本章综述 代码分析 贝祖公式 本章综述 大整数ZZ类主要实现了任意长度大整数表示.最大公因数.Jacobi符号和素性检验.笔者将通过 ...
- NTL密码算法开源库——大整数ZZ类(一)
2021SC@SDUSC 本章综述 大整数ZZ类主要实现了任意长度大整数表示.最大公因数.Jacobi符号和素性检验.笔者将通过逐个分析ZZ.cpp源代码中函数的形式来一步步向读者展示NTL是如何实现 ...
- NTL密码算法开源库——大整数ZZ类(四)
2021SC@SDUSC RSA算法原理 密钥生成的步骤 第一步,随机选择两个不相等的质数p和q. 爱丽丝选择了61和53.(实际应用中,这两个质数越大,就越难破解.) 第二步,计算p和q的乘积n. ...
- NTL密码算法开源库——大整数ZZ类(二)
2021SC@SDUSC 素数检测 (1)数学基础:费马小定理,二次探测定理,欧拉定理,Miller-Rabin素数测试,同余式, wilson定理,乘法逆元,简化剩余系 费马小定理:若存在整数 a ...
- NTL密码算法开源库——大整数上多项式(ZZX,GF2X)
2021SC@SDUSC 大整数上多项式(ZZX,GF2X) GF(2)域求两多项式的最大公因式 扩展欧几里得求两多项式最大公因式 GF(2)域求两多项式的最大公因式 //在GF(2)域中求两多项式的 ...
- NTL密码算法开源库--综述
2021SC@SDUSC NTL密码算法开源库--综述 项目综述 NTL算法库是开放源码的自由软件,具有专业处理任意精度大整数.实数的计算数论与计算代数的高性能可移植c++库,提供了任意大整数.任意精 ...
- NTL密码算法开源库(数论库)代码分析项目--综述
2021SC@SDUSC NTL密码算法开源库(数论库)代码分析项目--综述 项目综述 NTL开源代码库的安装和使用 NTL代码开源库主要解决的问题 项目分工以及核心代码的分配 项目综述 NTL算法库 ...
- 【NTL密码算法开源库-概述】
NTL库基本数据类型 ZZ: big integers(支持不等式运算) ZZ_p: big integers modulo p zz_p: integers mod "single pre ...
- NTL密码算法开源库——模二整数上的矩阵(mat_GF2)
2021SC@SDUSC 模二整数上的矩阵(mat_GF2) 矩阵运算 高斯消元 矩阵运算 具体代码 #include <NTL/matrix.h> #include <NTL/ve ...
最新文章
- java jni调用dll文件_Java通过jni调用动态链接库
- UpdatePanel中用后台调用Javascript
- SAP UI5 get route - local version VS central version
- 蒋金楠:200行代码7个对象《ASP.NET Core框架揭密》苏州.NET俱乐部课程分享
- 魔界的青蔷薇也能在人间开放了
- C语言信息系统贴吧,急 c语言学生信息管理系统
- 7-Arco大讲堂(二)
- Delphi 两种类的声明方法
- 贝壳找房的深度学习模型迭代及算法优化
- 人的大脑是如何识别运动物体
- excel做地图热力图_如何用excel制作中国地图热力数据图
- java毕业设计_基于java的毕业设计
- 移动通信-WCDMA物理信道
- 真相了!他说:码农和程序员的区别就在这!网友炸锅了
- IT行业发展趋势及就业前景?
- 嵌入式Linux开发板_WIFI无线网卡驱动移植
- 从废弃塑料瓶到鼠标,微软海洋环保鼠标背后不一般的工程实践
- 苏大计算机学院在哪,苏州大学计算机技术学院导师介绍:纪其进
- nginx fastcgi_buffers设置
- Sql server语句(增删改查)
热门文章
- 图书管理系统需求规格说明文档目录_一个已经超越普通设计素材管理范畴的文档管理软件—Eagle...
- openssl 1.0.2k-fips 升级到 openssl-3.0.5
- 怎样识别app网站服务器在国外,APP服务器你了解多少?什么是海外app服务器
- aspose.words复制插入同一word文档中的某个页面
- IT行业产品经理和项目经理的区别?
- sequence-数据库-sjk
- 好文:练习一万小时成天才?(by同人于野)
- n阶乘计算器 超大数 理论可计算8位数以内的阶乘数
- 未来计算机手抄报图片,【科技与未来手抄报图片大全】未来科技手抄报图片_科技创造未来手抄报设计_亲亲宝贝网...
- html超链接几种写法