Algorithm,Number Theory,GCD


#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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM