算法竞赛中的数论经典定理

素数定理:为小于等于的素数个数,那么有

定理:,那么有

定理:,那么

定理:,那么的值为

(1)为素数,那么答案就是

(2)有多个素因子,那么答案就是

(3)只有一个素因子,那么答案就是该素因子

定理:Fib数,那么有

定理:给定两个互素的正整数,那么它们最大不能组合的数为,不能组合的数的个数为

定理:

    (满足积性函数)

定理:

定理:任何个连续的正整数的乘积均可被整除

关于上述定理的两个结论

(1)如果是素数,那么均能被整除

    证明:如果,那么有,由于素数,那么有

,所以对所有的

很明显能被整除。

Euler函数及其证明:

1.p^k的欧拉函数
对于给定的一个素数p,我们知道φ(p) = p-1。(φ(n)是Euler函数,表示和n互素的小于n的正整数的个数。) 
假设一个整数n是p的k次幂,也就是n = p^k,k∈N+
容易证明 φ(n) = p^k - p^(k-1)  
证明:已知小于p^k的正整数个数为p^k-1个,其中 
和p^k不互质的正整数有{p×1,p×2,...,p×(p^(k-1)-1)}共计p^(k-1)-1个 
所以φ(n) = p^k -1 - (p^(k-1)-1) = p^k - p^(k-1)
2.pq的欧拉函数
假设p,q是两个互质的正整数,则pq的欧拉函数为 
φ(pq) = φ(p)φ(q),gcd(p,q)=1(gcd(p,q)表示p与q的最大公约数,gcd(p,q)=1即表示p与q互质)
证明: 
∵m= pq, gcd(p,q) =1 
∴根据中国余数定理,有Zm和Zp×Zq之间存在一一映射 
所以M的完全余数集中元素的个数等于集合Zp×Zq元素的个数 
而后者的元素个数为φ(p)φ(q),所以有 φ(pq) = φ(p)φ(q)
3.任意正整数的欧拉函数
φ(n)=n∏(1-1/p),其中p为能够被n整除的质数

Euler定理及其证明:
对于互质的整数a和n,有a^φ(n) ≡ 1 (mod n) (1 (mod n)表示除以n后余1的整数)
证明:首先证明下面这个命题:
对于集合Zn={x_1,x_2,...,x_φ(n)},考虑集合
S = {ax_1(mod n),ax_2(mod n),...,ax_φ(n)(mod n)}
则S = Zn
1) 由于a,n互质,x_i也与n互质,则ax_i也一定于n互质,因此
任意x_i,ax_i(mod n) 必然是Zn的一个元素
2) 对于Zn中两个元素x_i和x_ j,如果x_i ≠ x_ j
则ax_i(mod n) ≠ ax_ j(mod n),这个由a、n互质和消去律可以得出。
所以,很明显,S=Zn
既然这样,那么
(ax_1 × ax_2×...×ax_φ(n))(mod n)
= (ax_1(mod n) × ax_2(mod n)× ... × ax_φ(n)(mod n))(mod n)
= (x_1 × x_2 × ... × x_φ(n))(mod n)
考虑上面等式左边和右边
左边等于(a^φ(n) ×(x_1 × x_2 × ... × x_φ(n))mod n)(mod n)
右边等于x_1 × x_2 × ... × x_φ(n))(mod n)
而(x_1 × x_2 × ... × x_φ(n))(mod n)和n互质
根据消去律,可以从等式两边约去,就得到:
a^φ(n) ≡ 1 (mod n)(≡表示恒等于)

(2)如果是素数,那么有

 证明:由结论(1)很容易得到,一般性的结论可以重复此结论而得到。

时间: 2024-08-01 05:16:48

算法竞赛中的数论经典定理的相关文章

算法竞赛中数论理论浅析

一.基本概念 带余除法(division algorithm,除法定理):a∈Z,d∈Z*,有唯一的整数 q 和 r,并且0≤r<d0,满足 a= d q+r.q 称为商,r  称为余数.通俗说法:整数除以正整数得到唯一的商(quotient)和余数(residue).  整除(divide exactly):称 a 整除 b ,当整数 a 除以非零整数 b ,商为整数,且余数为零, 我们就说a能被b整除(或说b能整除a),记作 b|a.b 称为 a 的约数(因数,common divisor)

算法竞赛中桶的概念与应用

算法竞赛中桶的概念与应用 在算法竞赛和计算机科学中,有一种特殊的数据结构,我们把它叫做--桶. 有许多和桶有关的算法和数据结构,想要学习它们,必须先明确好桶的概念与应用. 桶的概念 刚刚已经讲过,桶是一种数据结构.数据结构的用途是以一种特殊方式统计数据,使得我们能够快速地修改.查询我们想要的那部分数据.但是一般我们在想要统计一组数据的时候,我们更关注的是这些数据都是什么.就比如我们现在要统计一个数列,我们更关心的是这个数列里到底有那些数,而不是特别关心这些数都出现了几次. 桶就打破了这个现状,作

STL函数 lower_bound 和 upper_bound 在算法竞赛中的用法

以前比较排斥这两个函数,遇到二分都是手写 \(while(left<=right)\). 这次决定洗心革面记录一下这两个函数的在算法竞赛中的用法,毕竟一般不会导致TLE. 其实百度百科已经概述得比较清楚了, 我们假设 \(value\) 为一个给定的数值, \(lower\_bound\) 是在一个升序序列中从前后后找第一个大于等于 \(value\) 的值, \(upper\_bound\) 是在一个升序序列中从前后后找第一个大于 \(value\) 的值. 比如:\(lower\_bound

算法竞赛中常见的数学(一):Fibonacci数列

最近做的题目有很多都是与Fabonacci数列有关的,身为信息组蒟蒻的我最近经常与数学组李中一大神(Orz)畅谈,其中包括Fabonacci数列的若干性质,此处做一个总结. 参考资料: <组合数学(第5版)>.<具体数学(第2版)> 正文: Fibonacci数列是形如0.1.1.2.3.5.8.13.21.34……的数列.递归形式定义为: 数列F[n]=F[n-1]+F[n-2],其中F[0]=0,F[1]=1. 当然也有这样的类Fibonacci数列,即形如: G[n]=G[n

【技巧】算法竞赛中对拍程序的写法

在竞赛过程中一个对拍程序可以帮你排除许多错误, 如果担心自己写的正解被一些小数据卡掉, 我们通常会写个对拍程序来检查正解的正确性, 通过大量数据观察正解与暴力的输出是否相同. 我们首先拿出我们写的可能会超时但是可以保证绝对正确的暴力程序,称作bf.exe, 然后拿出我们写的待检测的正解,称作std.exe, 接着我们写一个随机数据生成程序,用来一次生成一组自制随机数据用来检测输出,称作gen.exe, 然后我们来写一个利用windows批处理的对拍程序. 在你的程序的根目录下新建一个称作chec

《算法竞赛入门经典(第二版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧.全书内容分为12 章,包括程序设计入门.循环结构程序设计.数组和字符串.函数和递归.C++与STL入门.数据结构基础.暴力求解法.高效算法设计.动态规划初步.数学概念与方法.图论模型与算法.高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量例题和习题.书中的代码规范.简洁.易懂,不

算法竞赛入门经典_2_变量及其输入

代码: //2017-6-19 变量及其输入 #include <stdio.h> #include <math.h> void AAndB(); void CircleZtArea(); int main() { AAndB(); CircleZtArea(); return 0; } void AAndB() { int a, b; scanf("%d%d", &a, &b); //scanf("%d", a);//错误,

算法竞赛入门经典——读书笔记day1

1-1:整数值用%d输出,实数用%f输出. 1-2:整数/整数=整数,浮点数/浮点数=浮点数. 1-3:scanf中的占位符和变量的数据类型应一一对应,且每个变量前需要加&符号. 1-4:在算法竞赛中,输入前不要打印提示信息.输出完毕后应立即终止程序,不 要等待用户按键,因为输入输出过程都是自动的,没有人工干预. 1-5:在算法竞赛中不要使用头文件conio.h,包括getch().clrscr()等函数. 1-6:在算法竞赛中,每行输出均应以回车符结束,包括最后一行.除非特别说明,每行的行首不

算法竞赛入门经典第2版 第1章

学习目标: 熟悉C语言程序的编译和运行 学会编程计算并输出常见的算术表达式的结果 掌握整数和浮点数的含义和输出方法.声明方法.读入方法 掌握数学函数的使用方法 初步了解变量的含义 掌握变量交换的三变量法 理解算法竞赛中的程序三部曲:输入.计算.输出 记住算法竞赛的目标及其对程序的要求 1.2 变量及其输入 1.如果一定要把浮点数值存放在一个int型变量中,将会丢失部分信息--不推荐这样做. 例1-1  圆柱体的表面积 #include <stdio.h> int main() { const