数论知识总结——史诗大作(这是一个flag)

1、快速幂

计算a^b的快速算法,例如,3^5,我们把5写成二进制101,3^5=3^1*1+3^2*2+3^4*1

1 ll fast(ll a,ll b){ll ans=1;for(;b;b>>=1,a=mul(a,a))if(b&1)ans=mul(ans,a);return ans;}//一行快速幂

2、快速乘

当模数较大时,直接乘会爆掉long long,需要快速乘法。

即用浮点计算倍数,做差相当于计算余数模2^63的结果,然后再模一下就好了(因为余数不超过long long)

1 typedef long long ll;
2 ll mul(ll x,ll y){return ((x*y-(ll)(((long double)x*y+0.5)/mod)*mod)%mod+mod)%mod;}//一行快速乘

3、同余原理(gcd)

定理:gcd(a,b)=gcd(b,a mod b)

证明:a可以表示成a=kb+r,则r=a mod b 

     假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r ,因此d是(b,a mod b)的公约数

     假设d 是(b,a mod b)的公约数,则 d|b , d|r ,而a=kb+r,因此d也是(a,b)的公约数

     因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

1 int gcd(a,b){return !b?a:gcd(b,a%b);}//一行gcd

4、丢番图方程

裴蜀定理:丢番图方程(二元一次,下同)ax+by=m有解当且仅当m|(a,b)

扩展gcd:求丢番图方程ax+by=gcd(a,b)的整数解

证明:a*x1+b*y1=gcd(a,b)

   b*x2+(a mod b)*y2=gcd(b,a mod b)

     因为gcd(a,b)=gcd(b,a mod b)

   得a*x1+b*y1= b*x2+(a mod b)*y2 = b*x2+(a-a/b*b)*y2 = a*y2+b*(x2-a/b*y2)

   所以x1=y2,y1=x2-a/b*y2

末状态:b=0,a=gcd(a,b)时,gcd(a,b)*x=gcd(a,b),得x=1

扩展欧几里得的过程可以理解为从末状态向上不断回溯的过程,直到得到原方程的一组解。

1 void exgcd(int a,int b,int &x,int &y)
2 {
3     if(b==0)  {x=1; y=0; return;}
4     exgcd(b,a%b,x,y);
5     int t=x;x=y;y=t-a/b*y;
6 }

丢番图方程的通解:若(a,b)=d, ax+by=m有一组解(x0,y0)通解为:x=x0+(b/d)k, y=y0-(a/dk)就是设法让正负相互对消,(真·小学奥数内容)

解惑:多数初学者可能会有这样的疑问(反正我刚学的时候有),要解的方程是ax+by=m,而以上算法解的是ax+by=gcd(a,b)

其实ax+by=gcd(a,b)可以变为ax*k+by*k=gcd(a,b)*k,令gcd(a,b)*k=m,求出k,然后x*k就是ax+by=m的解。

5、乘法逆元

留个坑

6、中国剩余定理

留个坑

参考文献——王梦迪河南省队培训讲稿《数论基础》

 

时间: 2024-11-09 09:22:51

数论知识总结——史诗大作(这是一个flag)的相关文章

一些数论知识

1.本原勾股数: 概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b^2=c^2 首先,这种本原勾股数的个数是无限的,而且构造的条件满足: a=s*t,b=(s^2-t^2)/2,c=(s^2+t^2)/2 其中s>t>=1是任意没有公因数的奇数! 由以上概念就可以导出任意一个本原勾股数组. 2.素数计数(素数定理) 令π(x)为1到x中素数的个数 19世纪最高的数论成就就是以下这个玩意儿: lim(x->∞){π(x)/(x/ln(x))}=1 数论最高成就,

数论知识整理

代码均未经过编译!!!(不用编译啦) 默认: #define ll long long 快速幂 正整数a,b,p,求a^b(mod p)的值,时间复杂度O(logb) ll ksm(ll a, ll b, ll p) { ll c = 1 % p; a %= p; while (b) { if (b & 1) c = c * a % p; a = a * a % p; b >>= 1; } return c; } 最大公约数 正整数a,b,求a,b的最大公约数,时间复杂度在log级别

bzoj 1951 [Sdoi2010]古代猪文(数论知识)

Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了.因此也很少有其他动物知道这样一个王国. 猪王国虽然不大,但是土地肥沃,屋舍俨然.如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃花源了.猪

bzoj 2242 [SDOI2011]计算器(数论知识)

Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p,计算满足Y^x ≡ Z ( mod P)的最小非负整数. Input 输入包含多组数据. 第一行包含两个正整数T,K分别表示数据组数和询问类型(对于一个测试点内的所有数据,询问类型相同). 以下行每行包含三个正整数y,z,p,描述一个询问. Output 对于每个询问,输出一行答案.对

知识就是力量:怎样做一个不冲动的人

原文地址:https://www.cnblogs.com/moonlightpeng/p/12146692.html

2019了,给自己立一个flag吧

新年伊始,元旦已过,虽然有迟了,但是,相对于整年来说,还是比较早.年度总结,年度规划,除过上交的报告以外,还得自己给自己立个flag,一次来督促自己,而不是为了别的.做这些事,不仅仅是为了能更好的工作,也为了能更好的生活. 自己已经毕业四年有余,距离技术大拿的水平还差的远了,那么,这4年来,技术如何,四年的技术积累该有什么水平,扪心自问,觉得惭愧.虽然说技术不过硬,但也是兢兢业业,恪尽职守,相对于同期水平,自我觉得还是不错的.但对于外面其他公司的来说,可能未必就与之比较,也有可能比他们都强,这都

一个FLAG #14# The SetStack Computer

题 集合栈计算机,完整题目见参考[1] 书上的原始代码如下: #include <iostream> #include <vector> #include <map> #include <set> #include <string> #include <stack> #include <algorithm> // algorithm是必要的?否则 set_union报错 using namespace std; typed

一个flag

最近要学的东西 1.矩阵树定理 2.KM 3.FFT 4.单纯型 5.自动机系列 6.插头DP 7.计算几何(?) 8.数学相关(?)

【专题】数论

推荐:数论知识总结--史诗大作(这是一个flag) ---下面都是学习的笔记,还没有整理,比较凌乱,有需自取吧.---  [素数测试]Miller-Rabin算法 引用自:数论部分第一节:素数与素性测试 by Matrix67 当p为素数时,有 费马小定理:a^(p-1)=1(%p) Miller-Rabin测试:对于x^2=1(%p),有x=n-1或x=1(x^2-1=(x+1)(x-1)). 探测过程:对于一个底数(可随机)x=d*2^k,从d到x探测时候均符合d*2^k==1&&(d