码迷,mamicode.com
首页 > 编程语言 > 详细

14欧几里德、扩展欧几里德算法模板

时间:2015-08-19 19:09:10      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

一、欧几里德算法:即辗转相除法,用于求两个整数a,b的最大公约数

见:最大公约数模板

二、扩展欧几里德算法:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数,必然存在整数对x,y,使得gcd(a,b)=ax+by。

kb2.3扩展欧几里德算法(求ax+by=gcd的解以及逆元)

技术分享
#include<iostream>
#include<stdio.h>
using namespace std;

//返回d=gcd(a,b);和对应于等式ax+by=d中的x,y
long long extend_gcd(long long a,long long b,long long &x,long long &y){
    if(a==0&&b==0)return -1;//无最大公约数
    if(b==0){x=1;y=0;return a;}
    long long d=extend_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}

//求逆元
//ax=1(mod n)
long long mod_reverse(long long a,long long n){
    long long x,y;
    long long d=extend_gcd(a,n,x,y);
    if(d==1)return (x%n+n)%n;
    else return -1;
}

int main(){
    long long a,b,x,y;
    scanf("%lld%lld",&a,&b);
    long long d=extend_gcd(a,b,x,y);
    printf("%lld x=%lld y=%lld\n",d,x,y);
    return 0;
}
View Code

 

14欧几里德、扩展欧几里德算法模板

标签:

原文地址:http://www.cnblogs.com/bofengyu/p/4742610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!