欧几里得

不定方程详解

橙三吉。 提交于 2020-02-08 17:42:42
二元一次不定方程 定义: a , b , c a,b,c a , b , c 是整数, a b ≠ 0 ab≠0 a b  ​ = 0 ,那么形如 a x + b y = c ax+by=c a x + b y = c 的方程称为二元一次不定方程。 定理:设 a , b a,b a , b 是整数,且 d = ( a , b ) d=(a,b) d = ( a , b ) ,如果 d ∣ c d|c d ∣ c ,那么方程存在无数多个整数解,否则方程不存在整数解。 ( ( a , b ) = g c d ( a , b ) ) ((a,b)=gcd(a,b)) ( ( a , b ) = g c d ( a , b ) ) 二元一次不定方程和 同余方程 之间可以相互转换的,例如在 a > 0 , b > 0 a>0,b>0 a > 0 , b > 0 的条件下,求解二元一次不定方程 a x + b y = c ax+by=c a x + b y = c 与求解同余方程 a x ≡ c ( m o d b ) ax≡c(mod\ b) a x ≡ c ( m o d b ) 是相同的。 求解同余方程使用 扩展欧几里得算法 ,二元一次不定方程同样可以使用扩展欧几里得算法。 由扩展欧几里得可知:设 a a a 和 b b b 不全为0,则存在整数 x , y x,y x , y ,使得

关于扩展欧几里得定理

允我心安 提交于 2020-02-04 18:06:03
链接地址 关于扩展欧几里得定理 众所周知,扩展欧几里得定理是用来求形如ax+by=c(a,b,c皆为整数)这样的方程的一组解[注,仅是一组解]的定理 该方程有解的条件 : 要使ax+by=c(a,b,c皆为整数) 有解,我们设k=gcd(a,b),可以将原方程写成\frac{a}{k}kx+\frac{b}{k}ky=c的形式 即 k(\frac{a}{k}x+\frac{b}{k}y)=c \because a,b,c均为整数 \therefore (\frac{a}{k}x+\frac{b}{k}y)一定是整数即k(\frac{a}{k}x+\frac{b}{k}y)一定是k的倍数 \therefore k|c 即 gcd(a,b)|c // k|c数学里为 c%k=0 由此可见,该方程有解的条件为c%gcd(a,b)=0 来源: CSDN 作者: “黎明” 链接: https://blog.csdn.net/weixin_43382740/article/details/104171054

数论基础

大城市里の小女人 提交于 2020-01-29 05:04:04
基本运算 取模(mod)取余(rem) 定义 给定一个正整数p,任意一个整数n,一定存在等式 : n = kp + r ; 其中 k、r 是整数,且 0 ≤ r < p,则称 k 为 n 除以 p 的商,r 为 n 除以 p 的余数。 对于正整数 p 和整数 a,b,定义如下运算: 取模运算:a % p(或a mod p),表示a除以p的余数。 模p加法: a+b算术和除以p的余数。(a + b) % p = (a % p + b % p) % p 模p减法: a-b算术差除以p的余数。(a - b) % p = (a % p - b % p) % p 模p乘法: a b算术乘法除以p的余数。(a b) % p = (a % p * b % p) % p 由以上定义易证欧几里得算法的正确性 定义(n,p)为n和p的最大公约数,要证明欧几里得算法正确性即证明(n,p)=(p,r); 设n,p的公因数为g,则g|n且g|p,由n = kp + r 得到g|r('|'为整除); 则n和p的最大公约数也是p和r的最大公约数. 取模和取余的区别 对于整型数a,b来说,取模运算或者取余运算的方法都是: 求 整数商: c = a/b; 计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入,而取模运算在计算c的值时,向负无穷方向舍入。

浅谈扩展欧几里得算法

女生的网名这么多〃 提交于 2020-01-28 20:13:38
浅谈扩展欧几里得算法 一. 算法简析   扩展欧几里得算法(又称 exgcd ),是来求解形如下面格式方程的解。 ax + by = c   其中 a , b , c 已经给出, x , y 为待求解的变量。 扩欧算法规定,当 c%gcd(a,b)!=0 的时候,上面方程不存在整数解。   这个结论可以由贝祖定理 推出 : 即如果 a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)   当上面的方程有解时,我们可以一定得到一组特解。下面我们就要推导下求特解的过程。 二. 算法推导   首先,我们知道 gcd(a,b) = gcd(b,a%b) ,再由上面的式子,我们可以推导得到                                 ax 1 +by 1 = gcd(a,b) = gcd(b,a%b) = bx 2 +(a%b)y 2 而 a%b 又等于 a - a/b*b(此处除法为向下取整)   根据等式两边对应项对应相等的原则,我们可以得到以下关系                                              x 1 = y 2 y 1 = x 2 - a/b*b*y 2   通过比较辗转相除法,考虑递归解决问题,应用上面的式子,我们可以发现连接递归上下层的是 gcd(a,b) = gcd(b,a%b),因此

关于数论

你。 提交于 2020-01-27 23:20:48
                  费马小定理 假设p是质数,且gcd(a,p)=1,那么a(p-1)≡1(mod p)。假设a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1.a^(p-1)%p=1(其中%为取模操作,且a<p,p为质数) #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<ctime> #define ll long long int//能够直接使用long long using namespace std; ll n; ll pd[14]= {10,35,77,535,71497,2,3,5,7,11,3161}; ll fastmul(ll a,ll b) { ll r=0; ll base=a; while(b!=0) { if(b%2!=0) { b--; r=(r+base)%n; } b=b/2; base=(base+base)%n; } return r%n; } ll fastpow(ll a,ll b) { ll r=1; ll base=a; while(b!=0) { if(b%2!=0) r=fastmul(r,base)%n; base=fastmul(base,base)

P1290 欧几里得的游戏(博弈论)

时光怂恿深爱的人放手 提交于 2020-01-24 13:35:33
博弈论是真的难!? 给你两个数,每次只能从大的那个减去小的数的正整数倍,先得到零的人获胜 分析一下,(假设为x,y,且x>y),x=ky+z,若k>=2,那么我(是不是就可以为所欲为了)想一下减完或者,留一个给对手减是不是都行,然后我再往后分析下,我不就必胜了么? 所以遇到了这种情况或者我可以直接赢的情况(x%y==0)直接输出就好了,否则再找这种情况不就得了(除了这两种情况,我只能规规矩矩的减,正整数倍) 1 #include<iostream> 2 using namespace std; 3 4 bool fun(int &a,int &b)//返回1就出现了赢家 5 { 6 int t1=max(a,b); 7 int t2=min(a,b); 8 a=t2; 9 b=t1%t2; 10 if(t1%t2)//表示非整除 11 { 12 if(t1/t2>=2)//不能整除但是系数大于0也结束 13 return 1; 14 else//继续 15 return 0; 16 } 17 else 18 { 19 return 1;//能整除就结束 20 } 21 } 22 int main(void) 23 { 24 int c; 25 cin>>c; 26 while(c--) 27 { 28 int a,b; 29 cin>>a>>b; 30 bool flag=1;/

阿凡达(类欧几里得算法)

六眼飞鱼酱① 提交于 2020-01-23 20:52:03
一、题目 二、解法 由于 n n n 很大,但是操作数很小,且一开始没有初值,很容易想到 动态开点 ,时间复杂度 O ( n log ⁡ n ) O(n\log n) O ( n lo g n ) 。 剩下的问题是如何计算一个修改段内的和,注意到 ( i − l + 1 ) ⋅ x % y = ( i − l + 1 ) ⋅ x + ( i − l + 1 ) ⋅ x y (i-l+1)\cdot x\% y=(i-l+1)\cdot x+\frac{(i-l+1)\cdot x}{y} ( i − l + 1 ) ⋅ x % y = ( i − l + 1 ) ⋅ x + y ( i − l + 1 ) ⋅ x ​ (本题解中的除号均为整除),前者等差数列,后者用经典的类欧几里得算法求和,总时间复杂度 O ( log ⁡ n ) O(\log n) O ( lo g n ) ,下面详细讲一下这个算法。 类欧几里得算法一般用于解决此类问题: f ( a , b , c , n ) = ∑ i = 0 n i a + b c f(a,b,c,n)=\sum_{i=0}^n \frac{ia+b}{c} f ( a , b , c , n ) = ∑ i = 0 n ​ c i a + b ​ ,给定 a , b , c , n a,b,c,n a , b , c , n 求 f f

类欧几里得算法

不想你离开。 提交于 2020-01-22 21:24:23
求 \(\sum_{x=0}^{n-1}\lfloor \frac{ax+b}{c} \rfloor\) 设 \(f(a,b,c,n)=\sum\limits_{x=0}^{n-1}\lfloor \frac{ax+b}{c} \rfloor\) 进行化简,得 \[ \begin{aligned} &f(a,b,c,n) \\ =&\sum_{x=0}^{n-1}\lfloor \frac{ax+b}{c} \rfloor \\ =&\sum_{x=0}^{n-1}\lfloor \frac{(a \bmod c)x + (a - a \bmod c)x+(b \bmod c)+(b - b \bmod c)}{c} \rfloor \\ =&\sum_{x=0}^{n-1}\lfloor \frac{(a \bmod c)x + (b \bmod c)}{c} \rfloor + \frac{(a - a \bmod c)x}{c} + \frac{b - b \bmod c}{c}\\ =&\sum_{x=0}^{n-1}\lfloor \frac{(a \bmod c)x + (b \bmod c)}{c} \rfloor + \lfloor \frac{a}{c} \rfloor x + \lfloor \frac{b}{c} \rfloor\\ =&\frac{n(n-1

扩展欧几里得算法

元气小坏坏 提交于 2020-01-22 20:33:10
裴蜀定理 对任何整数 \(a\) , \(b\) 关于未知数 \(x\) 和 \(y\) 的线性不定方程(称为裴蜀等式): \(ax+by=c\) 方程有整数解(当且仅当 \(c\) 是 \(gcd(a,b)\) 的倍数),裴蜀等式有解时必然有无穷多个解 即 \(ax+by=c\) 有解的充要条件为 \(gcd(a,b)|c\) 原方程的解即为 \(ax+by=gcd(a,b)\) 的解乘上 \(\frac{c}{gcd(a,b)}\) 扩欧解出的 \(x\) 为 \(ax+by=gcd(a,b)\) ,中的 \(x\) ,若要求 \(ax+by=c\) 中的 \(x\) ,两边还要乘上 \(\frac{c}{gcd(a,b)}\) 推论: \(a\) , \(b\) 互素等价于 \(ax+by=1\) 有解 计算其中整数 \(x\) 和整数 \(y\) 的计算方法被称为扩展欧几里得算法 \(code :\) int exgcd(int a,int b) { if(!b) { x=1,y=0;//x,y设为全局变量 return a;//若为void,此处直接return } int ans=exgcd(b,a%b),tmp=x; x=y,y=tmp-a/b*y; return ans;//得到的为gcd(a,b) } 由欧几里得算法,得 \[ax+by=gcd(a,b)=gcd

欧几里得算法

[亡魂溺海] 提交于 2020-01-20 23:50:10
欧几里得算法又称辗转相除法,用于计算两个正整数的最大公约数。 gcd(a,b) = gcd(b,a%b) int gcd(int a, int b) { return b? gcd(b, a % b) : a; } 拓展欧几里得算法 void gcd(int a, int b, int &d, int &x, int &y){ if(!b) d = a, x = 1, y = 0; else gcd(b, a % b, d, y, x),y -= x * (a / b); } 来源: https://www.cnblogs.com/nioh/p/12219813.html