美文网首页
中国剩余定理

中国剩余定理

作者: 范一婷 | 来源:发表于2016-05-06 13:43 被阅读92次

    昨天下午同事给我出了一到题目:

    一筐鸡蛋,1个1个拿,拿完;2个2个拿,剩余1个;3个3个拿,拿完;4个4个拿,剩余1个;5个5个拿,剩余1个;6个6个拿,剩余3个;7个7个拿,拿完;8个8个拿,剩余1个;9个9拿,拿完。请问鸡蛋最少多少个?

    最简答的做法就是循环,代码如下

    x=range(1,1000)
    s=filter(lambda x:x %2==1 and x%3==0 
                and x%4==1 and x%5==1 
                and x%6==3 and x%7==0 
                and x%9==0 and  x%5==1 
                and x%8==1 x%9==1,x)
    print s
    

    这样写,憋说你学过编程!!

    好了,其实这是一种很经典的题目,中国剩余定理,不了解的可以看一下基础数论中欧几里得算法,扩展欧几里得算法

    # -*- coding: utf-8 -*-
    __author__='fanyiting'
    import datetime
    
    #求乘法逆元
    def ext_euclid(a,b):
        if not b:
            return a,1,0
        else:
            g,x,y=ext_euclid(b,a%b)
            return g,y,x-y*(a/b)
    
    #中国剩余定理,要求m两两互素
    def cal(t,m,a):
        starttime=datetime.datetime.now()
        M=1
        result=0
        for i in m:
            M=M*i
        for i in range(t):
            Mi=M/m[i]
            G,X,Y=ext_euclid(Mi,m[i])
            result=(result+Mi*X*a[i])%M
        stoptime=datetime.datetime.now()
        print 'run time  {}'.format((stoptime-starttime))
        return result
    
    sum=cal(4,[5,7,8,9],[1,0,1,0])  
    print sum
    

    相关文章

      网友评论

          本文标题:中国剩余定理

          本文链接:https://www.haomeiwen.com/subject/vvhjrttx.html