0
点赞
收藏
分享

微信扫一扫

欧几里德算法解一步之遥

求索大伟 2022-01-31 阅读 49
java

依据题意:97 x - 127 y = 1    可以将其看作:ax+by=m,此刻m=1,即要求a、b互素此方程才有解。(详见欧几里德算法及其扩展

而97、127恰巧互素,符合要求。

代码实现如下:

public class Main{
    public static void main(String[] args){
        try{
            long ans=ExtGcd.linearEquation(97,-127,1);
            long x=ExtGcd.x;
            long y=EctGcd.y;
            System.out.println(abs(x)+abs(y));
        }catch(Ecteption e){
            e.printStackTrance();
        }
    } 
    private static class ExtGcd{
        static long x,y;
        /**
        *扩展欧几里德
        *调用完成后x y是ax+by=gcd(a,b)的解
        */
        public static long ext_gcd(long a,long b){
            if(b==0){
                x=1;
                y=0;
                return a;
            }
            long res=ext_gcd(b,a%b);
            long x1=x;
            x=y;
            y=x1-a/b*y;
            return res;
        }
        /**
        *线性方程
        *ax+by=m 当m是gcd(a,b)倍数时有解
        *等价于ax=m mod b
        */
        public static long linearEquation(long a,long b,long m)throws Exception{
            long d=ext_gcd(a,b);
            //m不是gcd(a,b)的倍数,这个方程无解
            if(m%d!=0)throw new Exception("无解");
            long n=m/d;
            x*=n;
            y*=n;
            return d;
        }
    }
}

当然,该题在蓝桥杯竞赛题中是填空题,此题手算其实要比敲代码更快得到结果。但是,以防万一日后遇到类似不给出固定m时等无法心算的情况。还是需要掌握运用扩展欧几里德算法求解的。

举报

相关推荐

0 条评论