您的位置:首页 > 编程语言 > Go语言

Algorithm,Number Theory,GCD

2013-07-24 13:08 190 查看
#ifndef GCD_H
#define GCD_H

#include <cstdlib>
#include <cmath>
#include <algorithm>

/***************************************************/
// 最大公约数_
int GCD(int x, int y)
{
int t;
while(y > 0) {
t = x % y;
x = y;
y = t;
}
return x;
}

/***************************************************/
// 快速gcd_
int kgcd(int a, int b)
{
if (a == 0) return b;
if (b == 0) return a;
// a,b都是偶数
if (!(a&1) && !(b&1)) return kgcd(a>>1, b>>1) << 1;
// a 奇 b 偶
else if (!(b&1)) return kgcd(a, b>>1);
else if (!(a&1)) return kgcd(b, a>>1);
else return kgcd(abs(a - b), std::min(a, b));
}

/***************************************************/
// a,n 互质,a 对 n 逆元
// ax ≡ 1 (mod n)
int Inv(int a, int n)
{
int d, x, y;
d = extended_euclid(a, n, x, y);// d = ax + ny
if(d == 1)  return (x%n + n) % n;// x可能为负数
else     return -1; // no solution
}

/***************************************************/
//如果GCD(a,b) = d, 则存在x, y, 使d = ax + by
// GCD(a, b) = ax + by
// a,b的线性组合系数,存在x,y中,返回 GCD(a,b)
// 递归式: a = bq + t
//        d = x'b + y't
//    代入: d = x'b + y'(a - bq)
//   得到 a系数 y', b系数 x' - qy'
int extended_euclid(int a, int b, int &x, int &y)
{
int d;
if(b == 0) {x = 1;     y = 0;     return a;}
d = extended_euclid(b, a % b, y, x);
y -= a / b * x;
return d;
}
/***************************************************/

#endif // GCD_H
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: