数论123

同余运算的性质

1、(a+b)%n=(a%n+b%n)%n 

示例:poj2551

 

  
  
  
  
  1. #include <stdio.h> 
  2. int main() 
  3.     unsigned int n; 
  4.     //stdin = fopen("data2551.txt","r"); 
  5.     //freopen("data2551.txt","r",stdin); 
  6.     while(scanf("%u",&n)!=-1) 
  7.     { 
  8.         unsigned int m=1,i=1; 
  9.         for(;m;i++) 
  10.         { 
  11.             m = (m<<3)+(m<<1); 
  12.             m++; 
  13.             m%=n; 
  14.         } 
  15.         printf("%u\n",i); 
  16.     } 
  17.     return 0; 

 

线性同余方程

ax=b(modn)

 

1:方程ax=b(mod n)对于未知量x有解,当且仅当gcd(a,n) | b。
2:方程ax=b(mod n)或者对模n有d个不同的解,其中d=gcd(a,n),或者无解。
3:设d=gcd(a,n),假定对整数x和y满足d=ax+by(比如用扩展Euclid算法求出的一组解)。如果d | b,则方程ax=b(mod n)有一个解x0满足x0=x*(b/d) mod n 。
特别的设e=x0+n,方程ax=b(mod n)的最小整数解x1=e mod (n/d),最大整数解x2=x1+(d-1)*(n/d)。
4:假设方程ax=b(mod n)有解,且x0是方程的任意一个解,则该方程对模n恰有d个不同的解(d=gcd(a,n)),分别为:xi=x0+i*(n/d) mod n 。

求解:(欧几里德算法)

 

 

  
  
  
  
  1. #include <iostream> 
  2.  
  3. using namespace std; 
  4.  
  5. __int64 exgcd(__int64 a, __int64 b, __int64 &x, __int64 &y) 
  6.  
  7.  
  8.     if(b==0) 
  9.  
  10.     { 
  11.  
  12.         x=1;y=0;return a; 
  13.  
  14.     } 
  15.  
  16.     __int64 r=exgcd(b, a%b, x, y); 
  17.  
  18.     __int64 t=x;x=y;y=t-a/b*y; 
  19.  
  20.     return r; 
  21.  
  22.  
  23. int main() 
  24.  
  25.  
  26.    __int64 a,b,n,d,x,y,e; 
  27.  
  28.     cin>>a>>n; 
  29.  
  30.     d=exgcd(a, n, x, y); 
  31.  
  32.     //ax+ny=d 
  33.  
  34.     return 0; 
  35.  
  36. }; 

 

 

你可能感兴趣的:(职场,数论,休闲,欧几里德算法,线性同余方程)