1. 程式人生 > >Python 求平方剩餘和離散對數

Python 求平方剩餘和離散對數

在密碼學上理論學習上,難免會有些計算量大的運算規則,像求解離散對數。這時最好的方案就是用計算機那億萬級的運算效能了,把這些規則用程式設計很容易描述,such as Python,優雅的藝術語言

離散對數:

#coding=utf-8
'''Author:Frank.ZhangLongQi
   Date:2017-01
   e-mail:[email protected]
   Descrip:離散對數
'''
F=5   #F
x1=0  #本原根x
y1=1  #本原根y
a=1   #a
b=1   #b
x2=x1
y2=y1
def reverse(d,mod):
    for tmp in range(1,mod):
        if tmp*d%mod==1:
            return tmp
for i in range(1,9):

    if x1==x2 and (y1+y2)==0:
        x2,y2=0,0
        print("{0}g:".format(i+1),end="")
        print("(0,0)")
        exit()
    else:
        if x1==x2 and (y1-y2==0):
            t=reverse(2*y1,F)
            tmp=(3*x1**2+a)*t%F
        else:
            if x1==x2:
                print("{0}g:".format(i+1),end="")
                print("(0,0)******over")
                exit()
            t=reverse(x2-x1,F)
            tmp=(y2-y1)*t%F

        x3=(tmp**2-x1-x2)%F
        y3=(tmp*(x1-x3)-y1)%F
        print("{0}g:".format(i+1),end="")
        print((x3,y3))
        x2=x3
        y2=y3



求平方剩餘:

F=5     #F=5
l=[]
for b in range(0,F):
    tmp=(b**3+b+1)%F #函式y=x**3+x+1
    t=(F-1)/2
    if (tmp**t)%F==1:
        for i in range(1,F):
            if (i**2-tmp)%F==0:
                l.append([b,i])
print(l)

相關推薦

Python 平方剩餘離散對數

在密碼學上理論學習上,難免會有些計算量大的運算規則,像求解離散對數。這時最好的方案就是用計算機那億萬級的運算效能了,把這些規則用程式設計很容易描述,such as Python,優雅的藝術語言離散對數:#coding=utf-8 '''Author:Frank.ZhangLo

Python1000以內所有3或5的倍數的

IV col 結果 range python spa color pytho pri 1 a=0 2 for n in range(1,1000): 3 if n%3==0 or n%5==0: 4 a=a+n 5 print(a) 運行結果:

python 階乘之和。1+2!+3!+...+20!的

blank HR IV sharp ML 術語 lis get 功能 階乘:也是數學裏的一種術語;階乘指從1乘以2乘以3乘以4一直乘到所要求的數;在表達階乘時,就使用“!”來表示。如h階乘,就表示為h!;階乘一般很難計算,因為積都很大。 分析:1、階乘的計算就是比較麻煩的一

【科技】原根的快速判斷方法以及對1離散對數的另一種想法

鑑於實際需要,本文中所選的模數$p$總是一個平凡質數,並用$\phi$表示$\phi (p) = p - 1$。 原根的定義: 基於$p$是質數,我們可以很簡單的把它的定義想成,如果一個數$a \in [0, p - 1]$是原根的充要條件是對於$x \in [0, p - 2]$,$a^{x}$互不相同

Python練習筆記 - -數列的

Python練習筆記 - - 求數列的和 題目描述 輸入描述: 輸出描述: 示例1 解題思路&程式碼段 函式小結 map()函式 split()函式 str.format()

python 從1加到100的,join的用法

li=[] def func3(x): li.append(str(x)) if x==1: return 1 return x+func3(x-1) # print(func3(100)) re=func3(100) print('%s=%s'%('+'.j

Python巢狀列表中每個元素的

L=[[3,5,8],10,[[13,14],15,18],20] #寫一個函式打印出所有元素print_list,返回這個列表中所有元素的和 使用type(x)進行判斷 L=[[3,5,8],10,[[13,14],15,18],20]

牛客網線上程式設計(六):數列的-python

題目描述 數列的第一項為n,以後各項為前一項的平方根,求數列的前m項的和。 輸入描述: 輸入資料有多組,每組佔一行,由兩個整數n(n < 10000)和m(m < 1000)組成,n和

python一個時間點的前一個月後一個月

python如何獲取一個時間點的前一個月和後一個月,網上雖然有很多教程,但是本人感覺太雜了而且不太好用,研究一番之後決定提供一種方法和思路。 #!/usr/bin/env python # -*- c

Python出 1+2!+3!+...+20!的

在不使用遞迴函式,使用迴圈巢狀的情況下實現1+2!+3!+…+20!的和 也就是 1+(1×2)+(1×2×3)+(1×2×3×4) sum=0 #定義和的變數 sum n=1 #定義累乘的初始值 for i in range(1,21): #range函式(1

離散對數橢圓曲線加密原理

序言 現代公鑰加密系統中,常用的加密演算法除了RSA還有離散對數加密和橢圓曲線加密。這兩者原理比較相似,在這裡一併介紹。 離散對數問題 我們在中學裡學的對數問題是指, 給定正實數aa和axax,求xx。也就是計算x=logaaxx=lo

python一重積分二重積分

首先是對一元函式求積分,使用Scipy下的integrate函式:from scipy import integrate def g(x): return (1-x**2)**0.5 #用integrate下的quad函式可以同時求出積分結果和誤差 res,err=

2019/01/06平方與倒數序列的部分

本題要求對兩個正整數m和n(m≤n)編寫程式,計算序列和m ​2 ​​ +1/m+(m+1) ​2 ​​ +1/(m+1)+⋯+n ​2 ​​ +1/n。 輸入格式: 輸入在一行中給出兩個正整數m和n(m≤n),其間以空格分開。 輸出格式: 在一行中按照“sum = S”的格式輸出部

任意底數任意真數的對數

#include<stdio.h> #include<math.h> int loga(int r,int b); int main(void) { int r,b,l; printf("What's the base?\n"); sca

離散對數

#include #define MAX 100 void main() {   int i,j, num,sum=0, m[MAX]={0},mm[MAX]={0},mm1[MAX]={0}

Python特徵值特徵向量、奇異值分解

問題1描述: 求解矩陣A=[-1 2 -3; 4 -6 6]的2範數。 其中,矩陣A的2範數為矩陣ATAA^{T}AATA的最大特徵值開平方根。 即利用Python求解2範數如下所示: >>> A=np.array([[-1,2,-3],[4,

python 8位各不相同的整數,1357位之和等於2468位之和,且為完全平方

一、解題思路: 二、引用的方法:        1)求平方根並判斷平方根是否為整數:              import math              math.sqrt(64)----但是得到的結果是含有一位小數點得到的結果是8.0             

Python 兩個 list 的交集差集

有時候,為了需求,需要統計兩個 list 之間的交集,並集,差集。查詢了一些資料,現在總結在下面: 1. 獲取兩個list 的交集 #方法一:a=[2,3,4,5]b=[2,5,8]tmp = [val for val in a if val in b]print

密碼學之Pohlig-Helliman演算法離散對數

對於一個素數p,先求n=p-1並將其分解為x個素數因子,對於每一個因子q及其指數c,應用Pohlig-Helliman演算法求解(a0,a1,a3............ac-1) 根據a=(for i=0 to c-1:ai*q^i)+s*q^(s為某一整數) 求得  x

python 200以內平方為迴文數的N的值

for n in range (1,201): sq = n*n str_sq = str(sq) str__sq = str_sq[::-1] #把字串倒序