这是一个数论系列:)

一、素数

×费马小定理

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相关推荐

  1. 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 ...

  2. hdu-3071 Gcd Lcm game---质因数分解+状态压缩+线段树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3071 题目大意: 给定一个长度为n的序列m次操作,操作的种类一共有三种 查询 L :查询一个区间的所 ...

  3. POJ2429 GCDLCM Inverse(整数分解,由GCD+LCM求a,b)

    POJ2429 GCD&LCM Inverse(整数分解,由GCD+LCM求a,b) 分类: 数论 2013-02-12 22:00  180人阅读  评论(1)  收藏  举报 题目:GCD ...

  4. 数论之素数及其相关定理

    数论之素数及其相关定理 一.素数定义 ​ 基本概念:素数又称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. ​ 唯一分解定理:一个数n肯定能被分解成 n=p1^a1 * p2 ...

  5. UVa 11388 - GCD LCM

    题目大意:给出两个数的最大公约数G和最小公倍数L,求出这两个数. 根据a*b = GCD * LCM,然后枚举判断就好了. 1 #include <cstdio> 2 typedef un ...

  6. 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= ...

  7. 数论(继续补充)(gcd + lcm + qpow + prime+qmul)

    #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...

  8. [GDUT 决赛]--GCD,LCM——我是好人(数论)

    Description 众所周知,我是好人! 所以不会出太难的题,题意很简单 给你两个数n和m,问你有多少对正整数对最大公约数是n,最小公倍数是m 最后友情提供解题代码(我真是太好人了) void s ...

  9. 【数论】素数(一):基本概念、性质、猜想、定理

    我的数论-素数部分博客共5part: 基本概念.性质.猜想.定理 素数筛法(埃式筛.欧拉筛.区间筛) 素数判断法(朴素法.模6法.Rabin-Miller及改进) 数的分解(Pollard-rho) ...

  10. POJ 2429 GCD LCM Inverse ★(pollard-ρ DFS枚举)

    题目链接:http://poj.org/problem?id=2429 题目大意:给定gcd(a,b)和lcm(a,b)(<2^63),求a和b,如果有多种情况,输出和最小的情况.   首先gc ...

最新文章

  1. sqlplus执行SQL文件
  2. linuxc线程信号-pthread_cond_wait理解
  3. PAT乙级(1022 D进制的A+B )
  4. C++中的构造函数小结
  5. 清除string内容_前端面试之javascript相关内容整理一
  6. 成功解决 XXX--1.0-SNAPSHOT.jar中没有主清单属性
  7. 台式计算机打印机共享,只需两步台式和笔记本电脑可共享打印机
  8. 【华为OD机试真题 JAVA】数字涂色
  9. 项目 0: 预测泰坦尼克号乘客生还率
  10. 关于路由器中设置IP与网关不在同一网段方法的问题
  11. java 微信分享朋友圈 链接显示图片_分享网页到微信朋友圈,显示缩略图的方法...
  12. MySQL面试题学习笔记
  13. STM32F103单片机驱动TM1637数码管显示模块
  14. python生成图文并茂的pdf--财务报表(四)封面(首页和正页定义)
  15. 批量jpg转png 批量png转jpg 批量jpg2png 批量png2jpg
  16. notepad数据对比插件_如何使用NotePad++的compare插件进行文本对比,来研究下吧
  17. 织梦插件-织梦插件大全-免费织梦插件大全
  18. 股票交易查询接口api源码分享
  19. WSL ubuntu xfce4桌面远程连接
  20. Docker和FastDFS上传和下载文件

热门文章

  1. 2022-2028年中国二次元行业深度调研及投资前景预测报告
  2. Ajax接收Java异常_java – 处理来自Servlet的Jquery AJAX响应中的异常
  3. 2022-2028年中国床上用品行业投资分析及前景预测报告
  4. 分析两小段c++代码 关于unsigned运算的坑
  5. 3 用python进行OpenCV实战之画图(直线,矩形,圆形)
  6. win10系统的“管理员”
  7. Jittor框架API
  8. CodeGen编写自定义表达式标记
  9. NVIDIA TensorRT高性能深度学习推理
  10. [JS] 关于parseInt的一个小知识:[‘1‘, ‘2‘, ‘3‘].map(parseInt)