《数论》3.6习题3------求一元线性同余方程所有解(不是方程组)基础练习例子&&求逆元

且当做模板:


program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
//求6789783*x≡2474010 (mod28927591)的所有解
//即是:ax≡b(mod m)的所有解
int ans[1000000];
void exgcd(int a,int b,int &d,int &x,int &y)
{
  if(!b)
    {
      x=1,y=0;
      d=a;
      return;    
    }     
    else
        {
          exgcd(b,a%b,d,x,y);
          int tmp=x;
          x=y;
          y=tmp-(a/b)*y;         
        } 
} 
int main()
{
int a,b,m;
int d,x,y; 
while(cin>>a>>b>>m)
{
  exgcd(a,m,d,x,y);                   
  if(b%d)
   { puts("impossible"); 
    continue;
    }
  x=x*(b/d)%m;
  for(int i=1;i<=d;i++)
   {
     ans[i]=(x+(i-1)*m/d)%m;
     cout<<ans[i]<<' ';       
   } 
} 
 
system("pause"); 
return 0;} 


 

 

 

 

求 逆元:

program:

#include<iostream>
 #include<stdio.h>
 #include<string.h>
 #include<math.h>
 #include<algorithm>
 using namespace std;
 //求乘法逆元 
 //即是:ax≡1(mod m)的解
 int ans[1000000];
 void exgcd(int a,int b,int &d,int &x,int &y)
 {
   if(!b)
     {
       x=1,y=0;
       d=a;
       return;    
    }     
    else
         {
           exgcd(b,a%b,d,x,y);
           int tmp=x;
           x=y;
           y=tmp-(a/b)*y;         
        } 
} 
int main()
 {
 int a,b,m;
 int d,x,y; 
while(cin>>a>>b>>m)
 {
  exgcd(a,m,d,x,y);                   
  if(d!=1)
    {
      puts("impossible"); 
      continue;
    }
   x=x*b%m;
   if(x<0)
     x+=m;
   cout<<x<<endl; 
} 
 
 system("pause"); 
return 0;} 


 

 

 


 

求逆元例子:

定义 如果ab≡1(mod m), 则称ba的模m逆,

         记作a的模m逆是方程ax≡1(mod m)的解.

例:求5的模7逆

做辗转相除法, 求得整数b,k使得 5b+7k=1, b是5的模7逆.

计算如下:

     7=5+2,  5=2×2+1.

回代    1=5-2×2=5-2×(7-5)= 3×5-2×7,

得 5 -1≡3(mod7).

例:求21的模73

做辗转相除法, 求得整数b,k使得 21b+73k=1, b21的模73逆.

计算如下:

     73=21*3+10

   21=10*2+1

回代    1=21-10*2

1=21-(73-21*3)*2

=21-73*2+6*21

=7*21-73*2

得 21 -17(mod73).

 

总结:其实通俗的说就是:a*b%m=1,b是a的逆元,那么求b的话就是a*b%m=1的b的最小整数值。即可

你可能感兴趣的:(《数论》3.6习题3------求一元线性同余方程所有解(不是方程组)基础练习例子&&求逆元)