费马小定理

费马小定理&欧拉定理

允我心安 提交于 2020-02-28 11:49:06
在 p 是素数的情况下,对任意整数 x 都有 x p ≡ x(mod p) 。这个定理被称作费马小定理 其中如果 x 无法被 p 整除,我们有 x p-1 ≡ 1(mod p) 。利用这条性质,在 p 是素数的情况下,就很容易求出一个数的逆元。那上面的式子变形之后得到 a -1 ≡ a p-2 (mod p) ,因此可以通过快速幂求出 逆元 。 我们先来证明一下费马小定理: 费马小定理证明: 一、 准备知识 引理 1 :剩余系定理 2 若 a,b,c 为任意 3 个整数 ,m 为正整数 , 且 (m,c)=1, 则当 ac≡bc(mod m) 时 , 有 a≡b(mod m) 证明: ac≡bc(mod m) 可得 ac–bc≡0(mod m) 可得 (a-b)c≡0(mod m) 因为 (m,c)=1 即 m,c 互质 ,c 可以约去 ,a–b≡0(mod m) 可得 a≡b(mod m) 引理 2 :剩余系定理 5 若 m 为整数且 m>1,a[1],a[2],a[3],a[4],…a[m] 为 m 个整数 , 若在这 m 个数中任取 2 个整数对 m 不同余 , 则这 m 个整数对 m 构成完全剩余系 . 证明:构造 m 的完全剩余系( 0,1,2,…m-1 ) , 所有的整数必然这些整数中的 1 个对模 m 同余 . 取 r[1]=0,r[2]=1,r[3]=2,r[4]

数学专题——学习笔记

北战南征 提交于 2019-12-01 05:23:17
目录 数论 扩展欧几里得 乘法逆元 1.费马小定理(最好写) 2.扩展欧几里得 3.递推 (扩展)中国剩余定理 (扩展)卢卡斯定理 莫比乌斯反演 杜教筛 函数 快速傅里叶变换(Fast Fourier Transformation) 快速数论变换(Number Theoretic Transforms) 快速沃尔什变换(Fast Walsh Transform) 矩阵 矩阵乘法及快速幂 矩阵加速 计算几何(没学) @(这里是对学过的数学相关算法的总结) 数论 扩展欧几里得 ta用于解二元一次不定方程: \[a*x+b*y=c\] 我们先考虑解这个方程: \[a*x+b*y=gcd(a,b)\] 如果 \(gcd(a,b)|c\) ,那么方程有解,否则无解 怎么解呢? 既然 \[a*x+b*y=gcd(a,b)\] 成立,那么易证下面这个式子也应该成立: \[b*x_1+(a\%b)*y_1=gcd(a,b)\] 接下来可以一直迭代,直到 \(b_n=0\) ,这时不难发现: \[a_n=gcd(a,b)\] 于是我们找到了一组特殊解: \[x_n=1,y_n=0\] 这时我们要做的是以这组特殊解倒推上一组方程的一组解。 由开始的两个式子可以做一些特殊的变化: \[a*x+b*y=gcd(a,b)\] \[b*x_1+(a\%b)*y_1=gcd(a,b)\] \(→\) \[a*x

Lucas定理模板

[亡魂溺海] 提交于 2019-11-27 05:38:48
一本通上不是很懂,所以自己查资料做了个总结。 Lucas定理: 若p是质数 ,则对于任意整数1<=m<=n,有:   c(n,m)%p=c(n%p,m%p)*c(n/p,m/p)%p 也就是把n和m表示成p进制数,对p进制下的每一位分别计算组合数,最后再乘起来。 最后一句话可能难以理解,实际上联想到平常求一个十进制数的二进制数,也是对十进制数进行不断取模,由除以二的余数得到二进制数,所以对于Lucas定理也差不多是一个道理。 由于计算过程中不断地取模,同时事实上c(n/p,m/p)仍可以拆分,所以主要用于组合数中n,m较大时的问题中。 模板题 【问题描述】   给出组合数c(n,m),表示从n个元素中选出m个元素的方案数。例如c(5,2)=10,c(4,2)。可是当n,m比较大的时候,c(n,m)很大!于是小波希望你输出c(n,m)mod p的值。 【输入格式】   输入数据第一行是一个正整数T,表示数据组数(T<=100)。   接下来是T组数据,每组数据有3个正整数n,m,p(1<=m<=n<=10 9 ,m<=10 4 ,m<p<10 9 ,p是质数)。 【输出格式】   对于每组数据,输出一个正整数,表示c(n,m)mod p的结果。 【样例输入】   2   5 2 3   5 2 61 【样例输出】   1   10 分析 可以看到题目中的数据范围 1<=m<=n<

逆元

大城市里の小女人 提交于 2019-11-26 22:12:29
在分数取模时总会用到逆元运算 在模运算中 (a + b) % p = (a%p + b%p) %p (对) (a - b) % p = (a%p - b%p) %p (对) (a * b) % p = (a%p * b%p) %p (对) (a / b) % p = (a%p / b%p) %p (错) 对于除法的模运算不适合,所以需要定义一个新的东西来求除法模运算,这个东西就是逆元 定义: (a/b)(mod p)=(a inv[b])(mod p) 或者 a b≡1(mod P)` inv[b]就是b的逆元 a就是b的逆元,或者ab或为逆元 则根据定义可知 除以一个数再取模等同于乘以这个数的逆元再取模 但是我们不能直接说一个数的逆元是多少, 应该这么说: 一个数 x 在模 p 的条件下的逆元是多少 比如2 * 3 % 5 = 1,那么3就是2关于5的逆元,或者说2和3关于5互为逆元 (a*inv[b])%p,inv[b]就是a关于p的逆元 条件:a与p互为质数,a才有关于p的逆元 转换除法模运算 根据取模运算 (a + b) % p = (a%p + b%p) %p (对) (a - b) % p = (a%p - b%p) %p (对) (a * b) % p = (a%p * b%p) %p (对) (a / b) % p = (a%p / b%p) %p (错) (a /