zoukankan      html  css  js  c++  java
  • 求模逆

    代码一

    # -*- coding: utf-8 -*-
    '''
    理论基础:
    (a*x)%c==1  x为a对c的模逆元
    x有解的充要条件是gcd(a,c)=1
    测试目标:
    求模逆
    拓展欧几里得算法求模逆:
    用类似辗转相除法,求二元一次不定方程 47x+30y=1  47x+30y=1的整数解。
    47 = 30 * 1 + 17
    30 = 17 * 1 + 13
    17 = 13 * 1 + 4
    13 = 4 * 3 + 1  先用欧几里得算法
    4=1*3+1
    然后把它们改写成“余数等于”的形式
    17 = 47 * 1 + 30 * (-1) //式1
    13 = 30 * 1 + 17 * (-1) //式2
    4 = 17 * 1 + 13 * (-1) //式3
    1 = 13 * 1 + 4 * (-3) ak
    然后把它们“倒回去”
    1 = 13 * 1 + 4 * (-3)
    1 = 13 * 1 + [17 * 1 + 13 * (-1)] * (-3) //应用式3
    1 = 17 * (-3) + 13 * 4
    1 = 17 * (-3) + [30 * 1 + 17 * (-1)] * 4 //应用式2
    1 = 30 * 4 + 17 * (-7)
    1 = 30 * 4 + [47 * 1 + 30 * (-1)] * (-7) //应用式1
    1 = 47 * (-7) + 30 * 11
    得解x=-7, y=11。
    47的逆元为-7
    '''
    def ext_euclid ( a , b ):
     if (b == 0):
         return 1, 0, a
     else:
         x , y , q = ext_euclid( b , a % b )
         x , y = y, ( x - (a // b) * y )
         return x, y, q
    x,y,q=ext_euclid(47,30) 
    print x   
    

    代码二

    #coding=utf-8
    x=[1,0]
    y=[0,1]  
    def gcd_x_y(a,b):
        if(a<b):
            a,b=b,a  
        i,na,nb=2,a,b
        while (a%b):
            r,q=a%b,int(a/b)
            x.append((x[i-2]-q*x[i-1]))
            y.append((y[i-2]-q*y[i-1]))
            a,b,i=b,r,i+1
        print "%d"%(x[i-1])
    gcd_x_y(47,30)
    
  • 相关阅读:
    springboot自定义jar打包不能导入到项目中
    ajax上传文件+传json数据
    cooladmin vitevue3 打包部署 nginx代理设置
    istio 安装
    logging
    orm 多对多
    shell 多线程
    舒服的jenkins子节点
    phpfpm coredump
    drf 自定义异常
  • 原文地址:https://www.cnblogs.com/zuoanfengxi/p/14124756.html
Copyright © 2011-2022 走看看