zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Linux就该这么学(第一天)
    在虚拟机中使用Git
    Myeclipse的一些快捷键整理(转)
    SpringMVC框架应用
    动态网页开发基础
    jsp数据交互(二)
    jsp数据交互(一)
    复习数据结构(基于大话数据结构)
    IO及NIO的总结
    学习正则表达式笔记
  • 原文地址:https://www.cnblogs.com/threef/p/3210439.html
Copyright © 2011-2022 走看看