数论中求公因子、求模逆的算法

数论中求公因子、求模逆的算法

都是采用欧几里德辗转算法,第一个还好理解,后一个比较复杂,具体的数学原理就不具体介绍了,这是专业的数学问题而不是计算机算法问题。有兴趣可以查看一下数论的书《初等数论》(闵嗣鹤、严士健),对一般人而言够用就行。

  1import java.util.Vector;
  2
  3
  4/**
  5 * 数论计算
  6 * @author xyz
  7 *
  8 */

  9
 10public class ShuLun {
 11
 12    /**
 13     * Get GCD
 14     * @param a
 15     * @param b
 16     * @return
 17     */

 18    static long gcd(long a,long b)
 19    {
 20        if(a<b)
 21        {
 22            long temp=a;
 23            a=b;
 24            b=temp;
 25        }

 26        
 27        long c = a;
 28        long d = b;
 29        long test = 0;
 30        while((test = c%d) > 0)
 31        {            
 32            c = d;
 33            d = test;
 34        }

 35        
 36        return d;
 37    }

 38    
 39    /**
 40     * Equation ax+by=1,GCD(a,b)=1
 41     * @param a
 42     * @param b
 43     * @return long[] x,y
 44     */

 45    static long[] getEquationXY(long a,long b)
 46    {
 47        boolean isChange = false;
 48        if(a<b)
 49        {
 50            long temp=a;
 51            a=b;
 52            b=temp;
 53            isChange = true;
 54        }

 55        
 56        int n=0;
 57        long k,p0=1,p1=0,q0=0,q1=1,temp;
 58        
 59        long c = a;
 60        long d = b;
 61        long test = 0;
 62        while((test = c%d) > 0)
 63        {  
 64            n++;
 65            k = c/d;
 66            
 67            if(n==1)
 68            {
 69                p1 = k;
 70                q1 = 1;
 71            }
else
 72            {
 73                temp = p1;
 74                p1 = p1*k+p0;
 75                p0 = temp;
 76                
 77                temp = q1;
 78                q1 = q1*k+q0;
 79                q0 = temp;
 80            }

 81            
 82            c = d;
 83            d = test;
 84        }

 85        
 86        if(n%2==1)
 87        {
 88            p1 = 0 - p1;
 89        }
else
 90        {
 91            q1 = 0 - q1;
 92        }

 93        
 94        if(isChange)
 95        {
 96            temp = p1;
 97            p1 = q1;
 98            q1 = temp;
 99        }

100        
101        return new long[]{q1,p1};
102    }

103    
104    /**
105     * EQ: ax=1 (mod m)
106     * @param a
107     * @param mod
108     * @return inverse,if -1 there's no inverse!
109     */

110    static long getInverse(long a,long m)
111    {
112        if(gcd(a,m)==1)
113        {
114            long xy[] = getEquationXY(a,m);
115            long temp = xy[0]%m;
116            if(temp<0)
117            {
118                temp+=m;
119            }

120            return temp;
121        }

122        return -1;
123    }

124    
125    
126    public static void main(String arg[])
127    {
128    }

129    
130}

131

posted on 2008-06-12 20:24  逍遥子  阅读(1476)  评论(0编辑  收藏  举报

导航