数论(一)——素数,GCD,LCM
这是一个数论系列:)
一、素数
×费马小定理
Theorem: 设 p 是一个素数,a 是一个整数且不是 p 的倍数,那么
很遗憾,费马小定理的逆定理是不成立的。对 a = 2,满足的非素数 n 是存在的。
比如 n = 341 = 11 × 31
对于整数 a,称满足的合数为以 a 为底的伪素数。
经测试,
前 10 亿的自然数中,同时以 2 和 3 为底的伪素数有 1272 个。
我们用费马小定理验证素数的话,出错的概率大概只有 0.000025。
×Miller-Rabin
Theorem:.若 p 是素数,x 是一个正整数,且 那么。
Corollary:设待测数为 n,取一个比 n 小的正整数 a,设,若 n 是素数,则要么,要么存在一个 i,满足 0 ≤ i < r 且 。
Solution:随机选取 k 个小于待测整数 n 的正整数作为底 a,用上面那个推论的逆定理来测试。时间复杂度O(k log n)。
这种方法仍是有反例的,但是若选择 2 和 3 为底,第一个反例就大到了 1373653。
Example:给出一个正整数n, 求不超过n的所有素数。
Solution:
1.枚举1-n的所有数做素数测试, 时间复杂度是O(n log n)。
2.逐次枚举 2 到 n,设当前枚举到 x,那么对所有满足把标记为非素数。时间复杂度 O(n log n)。
3.线性筛法:
memset(not_prime, 0, sizeof(not_prime));
not_prime[1] = true;
for (int i = 2; i <= n; ++i)
{if (!not_prime[i]) prime[++ prime_count] = i;for (int j = 1; j <= prime_count; ++j){if (prime[j] * i > n) break;not_prime[prime[j] * i] = true;if (i % prime[j] == 0) break;}
}
关键在倒数第3行,它保证了我们总是能够找到每个数的最小的那个素因子。因为每个不小于1 的整数的最小素因子个数是 1,所以复杂度是 O(n)。
×唯一分解定理
Theorem:每个大于1的整数均可分解为有限个素数的乘积, 并且若不计因子在分解中的次序, 则这种分解式是唯一的。
二、GCD 和 LCM
×Definition(GCD,LCM):略。
×Example: 给两个正整数a, b, 求他们的最大公约数和最小公倍数。
×Solution:欧几里得算法
int Gcd(int a, int b)
{if (b == 0) return a;else return Gcd(b, a % b);
}
求 n 个不超过 m 的正整数的最大公约数的复杂度是 O(n + log m)。
×Example: 求不定方程 ax + by = m 的整数解。
×Theorem:ax+ by = m 有整数解当且仅当 (a, b)|m。
×Theorem:设 (x0 , y0 ) 是不定方程 ax + by = m 的一组解, (a, b) = g,那么全部解为,其中t为所有整数。
×Solution(扩展欧几里得算法)
int ExGcd(int a, int b, int &x, int &y)
{if (b == 0) {x = 1, y = 0;return a;}else {int g = ExGcd(b, a % b, x, y);int t = x;x = y, y = t - a / b * x;return g;}
}
考虑从 bx + (a mod b)y = g 的 (x, y) 推导到 ax′ + by′ = g 的 (x′ , y′ )。
以NOIp2012提高组Day2Mod一题为例子:
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int exgcd(int a, int b, int &x, int &y)
{if (b == 0){x = 1, y = 0;return a;}else{int g = exgcd(b, a % b, x, y);int t = x;x = y, y = t - a / b * x;return g;}
}int main()
{int a, b, x, y, d;scanf("%d%d", &a, &b);d = exgcd(a, b, x, y);if (d == 1) printf("%d\n", (x % b + b) % b);return 0;
}
×Example:求解一次同余方程组
×Solution:当mi两两互素时, 是经典的中国剩余定理, 请自行百度或Google。
×Solution:介绍一种基于“合并”思想的算法, 当mi不满足两两互素时, 也同样能够工作
可以写成
设 g = gcd(m1, m2), 若b2 - b1 能被g整除,则可以继续
用扩展欧几里得算法算出,则两个同余式可以合并为
×Definition(逆元):设正整数模m, 对于任意正整数a满足(a, m) = 1, 总存在惟一的b满足 且 , 称b为模m意义下a的逆元。其实,严格意义上讲b属于模m的一个缩系。
×Example:给出正整数a 和 m,保证 (a, m) = 1,求模 m 意义下 a 的逆元。
×Solution:根据定义用扩展欧几里得解一个线性同余方程即可
注意到 a × b ≡ 1 (mod m) 可以认为是 ,所以当我们需要在模 m意义下除以 a 时,可以用乘上 b 来代替,这就是逆元的用途。
转载于:https://www.cnblogs.com/joker0429/archive/2013/01/11/2909923.html
数论(一)——素数,GCD,LCM相关推荐
- GCD and LCM Aizu - 0005(辗转相除)+GCD LCM Inverse POJ - 2429(java或【Miller Rabin素数測试】+【Pollar Rho整数分解】)
题目:GCD and LCM Aizu - 0005 Write a program which computes the greatest common divisor (GCD) and the ...
- hdu-3071 Gcd Lcm game---质因数分解+状态压缩+线段树
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...
- POJ2429 GCDLCM Inverse(整数分解,由GCD+LCM求a,b)
POJ2429 GCD&LCM Inverse(整数分解,由GCD+LCM求a,b) 分类: 数论 2013-02-12 22:00 180人阅读 评论(1) 收藏 举报 题目:GCD ...
- 数论之素数及其相关定理
数论之素数及其相关定理 一.素数定义 基本概念:素数又称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 唯一分解定理:一个数n肯定能被分解成 n=p1^a1 * p2 ...
- UVa 11388 - GCD LCM
题目大意:给出两个数的最大公约数G和最小公倍数L,求出这两个数. 根据a*b = GCD * LCM,然后枚举判断就好了. 1 #include <cstdio> 2 typedef un ...
- POJ 2429 GCD LCM Inverse
设答案为ans1,ans2 ans1=a1*gcd,ans2=a2*gcd,a1,a2互质 gcd*a1*b1=lcm,gcd*a2*b2=lcm a1*b1=lcm=(ans1*ans2)/gcd= ...
- 数论(继续补充)(gcd + lcm + qpow + prime+qmul)
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- [GDUT 决赛]--GCD,LCM——我是好人(数论)
Description 众所周知,我是好人! 所以不会出太难的题,题意很简单 给你两个数n和m,问你有多少对正整数对最大公约数是n,最小公倍数是m 最后友情提供解题代码(我真是太好人了) void s ...
- 【数论】素数(一):基本概念、性质、猜想、定理
我的数论-素数部分博客共5part: 基本概念.性质.猜想.定理 素数筛法(埃式筛.欧拉筛.区间筛) 素数判断法(朴素法.模6法.Rabin-Miller及改进) 数的分解(Pollard-rho) ...
- POJ 2429 GCD LCM Inverse ★(pollard-ρ DFS枚举)
题目链接:http://poj.org/problem?id=2429 题目大意:给定gcd(a,b)和lcm(a,b)(<2^63),求a和b,如果有多种情况,输出和最小的情况. 首先gc ...
最新文章
- sqlplus执行SQL文件
- linuxc线程信号-pthread_cond_wait理解
- PAT乙级(1022 D进制的A+B )
- C++中的构造函数小结
- 清除string内容_前端面试之javascript相关内容整理一
- 成功解决 XXX--1.0-SNAPSHOT.jar中没有主清单属性
- 台式计算机打印机共享,只需两步台式和笔记本电脑可共享打印机
- 【华为OD机试真题 JAVA】数字涂色
- 项目 0: 预测泰坦尼克号乘客生还率
- 关于路由器中设置IP与网关不在同一网段方法的问题
- java 微信分享朋友圈 链接显示图片_分享网页到微信朋友圈,显示缩略图的方法...
- MySQL面试题学习笔记
- STM32F103单片机驱动TM1637数码管显示模块
- python生成图文并茂的pdf--财务报表(四)封面(首页和正页定义)
- 批量jpg转png 批量png转jpg 批量jpg2png 批量png2jpg
- notepad数据对比插件_如何使用NotePad++的compare插件进行文本对比,来研究下吧
- 织梦插件-织梦插件大全-免费织梦插件大全
- 股票交易查询接口api源码分享
- WSL ubuntu xfce4桌面远程连接
- Docker和FastDFS上传和下载文件
热门文章
- 2022-2028年中国二次元行业深度调研及投资前景预测报告
- Ajax接收Java异常_java – 处理来自Servlet的Jquery AJAX响应中的异常
- 2022-2028年中国床上用品行业投资分析及前景预测报告
- 分析两小段c++代码 关于unsigned运算的坑
- 3 用python进行OpenCV实战之画图(直线,矩形,圆形)
- win10系统的“管理员”
- Jittor框架API
- CodeGen编写自定义表达式标记
- NVIDIA TensorRT高性能深度学习推理
- [JS] 关于parseInt的一个小知识:[‘1‘, ‘2‘, ‘3‘].map(parseInt)