单变量线性同余方程的C++实现

来源:互联网 发布:淘宝卖家订单险多少钱 编辑:程序博客网 时间:2024/06/05 10:12

在这里要注意一点的就是乘法逆的求法:

求a关于n的乘法逆的方法就是利用扩展的欧几里得算法求解:

s * n + a * t = 1 (gcd(n,a) = 1才存在乘法逆)

实现代码如下:

int gcd(int x,int y){      return y == 0 ? x : gcd(y,x%y);   }   void exEuclidean(int a,int b,int &s,int &t){      int r1 = a, r2 = b , s1 = 1, s2 = 0, t1 = 0, t2 = 1;//初始化      int q,r;       while(r2 > 0)      {          q = r1 / r2;            r = r1 - q * r2; //也就是r = r1%r2;          r1 = r2;          r2 = r;            s = s1 - q * s2;          s1 = s2;          s2 = s;                  t = t1 - q * t2;          t1 = t2;          t2 = t;       }      //gcd(a,b) = r1;       s = s1;       t = t1;  }  int main(){int a,n,b;printf("请依次输入ax %% n = b方程中的系数 a , n ,b!\n");//其实就是ax = kn + b ,也就是 ax + nk = b-------线性丢番图方程 scanf("%d %d %d",&a,&n,&b);int gcd_a_n = gcd(a,n);if(b%gcd_a_n != 0){//根据线性丢番图方程 ax + by = c中如果gcd(a,b)不能整除c的话,无解 printf("gcd(a,n)不能整出b,该方程无解\n");}else{ //有解 //(1)除以gcd_a_n,简化方程 a /= gcd_a_n;n /= gcd_a_n;b /= gcd_a_n; //(2)乘以a的乘法逆,找出方程特解x0//利用扩展的欧几里得算法求 n * s + a * t = 1(注意:1是n和a的gcd)           int s,t;          exEuclidean(n,a,s,t); //因为传引用,s和t得到解了         int a_ = (t >= 0) ? (t % n) : ((t-t*n)%n); //乘法逆就是t映射于n的值         int x0 = (b*a_)%n;        printf("特解是%d\n",x0); //(3)得到所有的通解 printf("通解是 x0 + k * %d , 0 <= k < %d\n",n,gcd_a_n);printf("所有的通解为:\n");vector<int> ans;for(int i = 0 ; i < gcd_a_n; i++){ans.push_back(x0 + i * n);printf("%d ",ans[i]);}printf("\n");}}

运行结果如下:


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信钱包密码忘了怎么办不用银行卡 企业网银密码输入三次错误怎么办 微信密码不知道手机也停用了怎么办 手机停用微信密码不记得了怎么办 农商银行登入密码忘记了怎么办 苹果手机忘记四位数解锁密码怎么办 银行卡用支付宝支付限额了怎么办 用银行卡号找回微信被盗密码怎么办 微信钱包密码错误被锁定怎么办 本人没玩财付通结果被扣了钱怎么办 我的银行卡给支付宝充不了钱怎么办 支付宝话费充错了怎么办啊 已充值成功送朋友话费不能送怎么办 微信绑定银行卡被盗刷q币怎么办 微信红包过了24小时没退回怎么办 微信6.67版本红包发错了怎么办 苹果6s还原后激活出错怎么办 q币充给了不存在的账号怎么办 怎么办微信的钱换成淘宝币 学信网密码密保手机号都忘了怎么办 第五人格玩游戏时总是闪退怎么办 qq安全中心密保手机换了怎么办 微信冻结账号绑定了银行卡怎么办 扣扣红包密码是支付密码忘了怎么办 红包退回通知不小心删除了怎么办 QQ炫舞金币充错账号怎么办 晋江的小说用晋江币买不了是怎么办 中国银行储蓄不能充值支付宝怎么办 微信怎么改银行卡密码忘记了怎么办 微信号手机号码换了密码忘了怎么办 微信被盗密码被改绑定手机号怎么办 微信qq号登陆改密码忘记了怎么办 本人微信红包赌博输了50万怎么办 4g飞享套餐话费用完了怎么办 手机丢了查话费欠了几百块怎么办 注销电信手机卡里面的余额怎么办 联通手机卡注销后里面的余额怎么办 手机卡网上销户以后剩余话费怎么办 联通新号注册微信发不了短信怎么办 韩博士装机卡在驱动恢复怎么办 xp打印后程序服务没有运行怎么办