那么把这么些同余方程中x的蝇头正整数解叫做a模m的逆元,数学思想十分重大

 费马小定理,欧拉定理
  
欧拉定理 当n>1
a^phi[n]≡1(mod n)

01.bool linear_equation(int a,int b,int c,int &x,int &y)  
02.{  
03.    int d=exgcd(a,b,x,y);  
04.    if(c%d)  
05.        return false;  
06.    int k=c/d;  
07.    x*=k; y*=k;    //求得的只是其中一组解  
08.    return true;  
09.}  

  本条呈报可能率论,bzoj4802标准难题

若二个数能够被5,7整除,但不得以被3整除,那么该数一定是5,7的倍数,5,7的最小公倍数:5*7=35,可是不能被3整除,且除3余1。
35%3=2,那么,能够(35✲a)%3=1,解之,a至少等于2:
5✲7✲2=70
梯次类推,能够被3,5整除,除7余3,3✲5✲b%7=3,b=3,解为3✲5✲3=45。
可以被3,7整除,除5余2:3✲7✲c%5=2,c=2,解为:3✲7✲2=42。

   求num最小正整数解;

p ✲ a+q ✲ b = c的任何整数解满足:
p = p1 + b/Gcd(a, b) ✲ t
q = q1 – a/Gcd(a, b) ✲ t(在那之中t为任性整数)
p 、q正是p ✲ a+q ✲ b = c的具有整数解。
连带认证可参照他事他说加以考察:http://www.cnblogs.com/void/archive/2011/04/18/2020357.html

 

设a 和 n的最大公约数为d,那么a 和 n 的最小公倍数为(a*n)/d.
即a✲dx = a✲n/d;
所以dx = n/d.
所以解之间的距离就求出来了.
代码如下:

  •   逆元
  •   欧拉函数gcd
     ex_gcd(多个较为重要的函数)
  •   费马小定理,欧拉定理,中华夏族民共和国剩余定理,Miller-Rabin(推断是不是为质数),Pollard-rho(大整数的因子分解)。

证实方程有一解是: x0 = x'(b/d) mod n;
由 a✲x0 = a✲x'(b/d) (mod n)
a✲x0 = d (b/d) (mod n) (由于 ax’ = d (mod n))
= b (mod n)

   num Mod a=b;

对此不定整数方程pa+qb=c,若 c mod Gcd(p,
q)=0,则该方程存在整数解,不然不设有整数解。
地点已经列出找一个大背头解的点子,在找到p ✲ a+q ✲ b = Gcd(p,
q)的一组解p0,q0后,p ✲ a+q ✲ b = Gcd(p, q)的其它整数解知足:
p = p0 + b/Gcd(p, q) ✲ t
q = q0 – a/Gcd(p, q) ✲ t(在那之中t为率性整数)
至于pa+qb=c的板寸解,只需将p ✲ a+q ✲ b = Gcd(p, q)的各类解乘上 c/Gcd(p,
q) 就可以。

   不说了,背背代码。  

还是能够绝不数论尾数的艺术来领悟:
引进实例:一个莫西干发型除以三余一,除以五余二,除以七余三,求这么些小小的整数。

   a*ex_gcd(b,c)%c,然后非常的慢幂求解

5✲7✲2=70
3✲5✲3=45
3✲7✲2=42

   a,b

也便是说a*dx正是a的翻番,相同的时间也是n的翻番,即a✲dx是a 和
n的公倍数.为了求出dx,大家理应求出a 和
n的最小公倍数,此时对应的dx是小小的的.

   满足的集聚为{x|x=num+k·[a,b],(k∈Z)}

首先入眼讲授中华夏族民共和国剩余定理,举例:
多少个数x除d1余r1,除d2余r2,除d3余r3,那么,求那一个数的细微值 。
解答:
r1,r2,r3一定是二个整数,一的倍数,所以能够行使到数论尾数的学问来解答,即逆元:
逆元:对王海鸰整数a和m,假使有ax=1(mod
m),那么把那个同余方程中x的细微正整数解叫做a模m的逆元。
比如2 * 3 % 5 = 1,那么3正是2关于5的逆元,或然说2和3有关5互为逆元。
那就是说在选取中,能够用到的是:逆元的施用法则,已知除以d1余r1,除d2余r2,除d3余r3,d1的数论倒数是M1,d2的数论倒数是M2,d3的数论尾数是M3,那么,x=M1✲r1+M2✲r2+M3✲r3。
出于或然赢得的数比d1,d2,d3的翻番要大,所以能够将获取的数减去公倍数,获得的正是以此数的细小值。

   c,d

方程ax≡b (mod n)的矮小整数解为:(ans%s+s)%s;

 数论学到这里告一段落了,时间是2017/4/18。这一段时间讲的剧情非常的少,但很关键,数学观念比较重大,差不离讲了以下几点。

率先看贰个简易的例证:
5x=4(mod3)
解得x = 2,5,8,11,14…….由此能够窥见二个规律,正是解的间隔是3.
这就是说这些解的距离是怎么决定的吗?
假若得以想尽找到第多少个解,並且求出解之间的距离,那么就足以求出模的线性方程的解集了.
咱俩设解之间的区间为dx.
那么有a✲x = b(mod n);a✲(x+dx) = b(mod n);两式相减,获得:
a*dx(mod n)= 0;

 
  定义是比较复杂的——详见算法导论P550

a✲ x0+ n✲ y0= d, 方程两侧乘以 b/ d,(因为 d|b,所以能够整除),获得 a✲
x0* b/ d+ n✲ y0✲ b/ d= b。
因而 x= x0✲ b/ d,y= y0✲ b/ d 为 ax+ ny= b 的贰个解,所以 x= x0✲ b/ d 为
ax= b (mod n ) 的解。
ax≡b (mod n)的四个解为 x0= x✲ (b/ d ) mod n,且方程的 d 个解分别为 xi=
(x0+ i✲ (n/ d ))mod n {i= 0… d-1}。

   能够形成求解 ax≡(d-b)(mod c);

同余方程ax≡b (mod n),若是 gcd(a,n)== 1,则方程仅有独一解。
在这种景色下,纵然 b== 1,同余方程便是 ax=1 (mod n ),gcd(a,n)= 1。
这时称求出的 x 为 a 的对模 n 乘法的逆元。
对于同余方程 ax= 1(mod n ), gcd(ax,n)= 1
的求解,即ax减一是n的整好数倍,要是为y倍,有ax=ny+1,由于y是一个未知量,故方程的求解就是解方程:ax+
ny= 1,x, y
为整数。这几个可用扩展欧几Reade算法求出,原同余方程的天下无双解正是用扩充欧几Reade算法得出的
x 。
如下代码,所求解为(ax)%b=1,求解为x的值:

  转折为八个线性方程 ax+by=c

此地关键教学欧几里得算法的恢宏算法:
(1)使用扩张欧几Reade算法消除不定方程的办法:

   ax+cy=d-b

(3)用欧几Reade算法求模的逆元:

    一般都以乘法求逆元a/b mod p
化为 a* b’mod p b’为b mod
p意义下逆元、

解答:被除数加上(或减去)除数的倍数,除数不改变,余数也不改变,那么,举例70为除3余1,而45,42都为3的倍数,那么,加上3的翻番未来除以3的结果还是是余1的,依次类推,可得上式解。

   因为x为最小正整数解,所以num为最小解

设 d= gcd(a,n),如若整数 x 和 y,满意 d= ax+
ny(用扩展欧几Reade得出)。即使 d| b,则方程

   这样num mod a=b

证实方程有d个解: xi = x0 + i✲(n/d) (mod n);
由 a*xi (mod n) = a ✲ (x0 + i✲(n/d)) (mod n)
= (a✲x0+a✲i✲(n/d)) (mod n)
= a ✲ x0 (mod n) (由于 d | a)
= b

   华夏余数定理

#include <iostream>
#include <cstdio>
using namespace std;

int x,y,q;
void extend_Eulid(int a,int b)
 {
     if(b == 0){
          x = 1;y = 0;q = a;
     }else{
         extend_Eulid(b,a%b);
         int temp = x;
         x = y;
         y = temp - a/b*y;
     }
}
int main()
{
     int a,b;
     cin>>a>>b;
     extend_Eulid(a,b);
     printf("%d=(%d)*%d+(%d)*%d\n",q,x,a,y,b);
     return 0;
}

  Miller-Rabin,Pollard-rho

在代码的达成过程中,考虑到程序的简洁性,日常选用的是第二个章程:求逆元解答,不过逆元须要怎么样求出呢?在此间运用的就是欧几里得算法。
欧几里得算法,又称辗转相除法,主要用来求解七个数的最大公约数:
能够动用递归迭代等方法,首要完毕情势为:
gcd(a,b)=gcd(b,a%b)。

    费马小定理 a^(p-1)≡1(mod p) p为素数

在找到p ✲ a+q ✲ b = Gcd(a, b)的一组解p0,q0后,应该是收获p ✲ a+q ✲ b =
c的一组解p1 = p0✲(c/Gcd(a,b)),q1 = q0✲(c/Gcd(a,b)),

   Num=a*x+b;

01.bool modular_linear_equation(int a,int b,int n)
02.{  
03.    int x,y,x0,i;  
04.    int d=exgcd(a,n,x,y);  
05.    if(b%d)  
06.        return false;  
07.    x0=x*(b/d)%n;   //特解  
08.    for(i=1;i<d;i++)  
09.        printf("%d\n",(x0+i*(n/d))%n);  
10.    return true;  
11.}  

   Num mod c=d-b+b=d

题解为70+45+42=157,由于3,5,7的最小公倍数是105,那么:
157-105=52。

 欧拉函数,扩欧

(2)用扩张欧几Reade算法求解模线性方程的法子:
同余方程 ax≡b (mod n)对于未知数 x 有解,当且仅当 gcd(a,n) |
b。且方程有解时,方程有 gcd(a,n) 个解。
求解方程 ax≡b (mod n) 相当于求解方程 ax+ ny= b, (x, y为整数)

   Num Mod c=d;

连带表明:

                        数论

欧几里得算法的扩大算法首要使用于八个地方:
(1)求解不定方程;
(2)求解模线性方程(线性同余方程);
(3)求解模的逆元;

 逆元

用扩张欧几里得算法解不定方程ax+by=c;
代码如下:

   用ex_gcd求解出x;

设ans=x✲(b/d),s=n/d;

相关文章