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