亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 3中具有大數字的精確數學

Python 3中具有大數字的精確數學

墨色風雨 2022-08-02 15:52:15
我正在嘗試實現一個類似于Shamir使用Python的秘密共享的加密系統。從本質上講,我有一些代碼可以生成一個點列表,可用于在這些點形成的梯度的y截距處找到密碼。密碼是ASCII中的數字(每個ASCII字符使用兩位數),因此是一個非常大的數字,密碼更大。例如,密碼ThisIsAPassword將生成一個點列表,如下所示:x    y9556 667070868679151261407532139467564416078610373009004083 285020401824471279644049941113413627155654573490009684 676006088806576629152046248985074246332975134993009197 64201036847801292531159022293017356403707170463200需要明確的是,這些點是在隨機選擇的斜率上生成的(這很好,因為重要的是y截距)。在嘗試制作程序以解碼密碼時會出現問題。使用正常的數學運算,Python無法準確地找到密碼,因為數字的大小。這是我的代碼:def findYint(x,y):    slope = (y[1] - y[0]) / (x[1] - x[0])    yint = int(y[0] - slope * x[0])    return yintdef asciiToString(num):    chars = [num[i:i+3] for i in range(0, len(num), 3)]    return ''.join(chr(int(i)) for i in chars)def main():    fi = open('pass.txt','r')    x,y = [], []    for i in fi:        row = i.split()        x.append(int(row[0]))        y.append(int(row[1]))    fi.close()    yint = findYint(x,y)    pword = asciiToString(str(yint))    print(pword)main()輸出(密碼為“ThisIsAPassword”):?)3 ?Μ????¢ǔ?通常,我的代碼將使用較短的密碼,例如“pass”或“word”,但是較大的數字可能沒有以將其轉換為ASCII所需的確切準確性進行計算。使用精確數學或其他方法的任何解決方案?此外,以下是生成點的代碼,以防萬一它很重要:import randomdef encryptWord(word):    numlist = []    for i in range(len(word)):        numlist.append(str(ord(word[i])).zfill(3))    num = int("".join(numlist))    return numdef createPoints(pwd, pts):    yint = pwd    gradient = pwd*random.randint(10,100)    xvals = []    yvals = []    for i in range(pts):        n = random.randint(1000,10000)        xvals.append(n)        yvals.append(((n) * gradient) + pwd)    return xvals, yvalsdef main():    pword = input("Enter a password to encrypt: ")    pword = encryptWord(pword)    numpoints = int(input("How many points to generate? "))    if numpoints < 2:        numpoints = 2    xpts, ypts = createPoints(pword, numpoints)
查看完整描述

3 回答

?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

如您所知,Python的內置類型可以處理任意大的整數,但該類型具有有限的精度。代碼中唯一處理非 s 數字的部分似乎是以下函數:intfloatint


def findYint(x,y):

    slope = (y[1] - y[0]) / (x[1] - x[0])

    yint = int(y[0] - slope * x[0])

    return yint

這里的除法結果為 a ,即使結果與 .此外,我們不能安全地在這里用運算符進行整數除法,因為在截斷應該發生之前,它將乘以。floatint//slopex[0]


因此,要么您需要做一些代數才能僅使用s獲得相同的結果,要么您需要使用精確的非整數類型而不是來表示分數(y 1 - y 0)/ (x1 - x0)。幸運的是,Python的標準庫有一個名為Refute的類,它將做你想要的:intfloat


from fractions import Fraction


def findYint(x,y):

    slope = Fraction(y[1] - y[0], x[1] - x[0])

    yint = int(y[0] - slope * x[0])

    return yint


查看完整回答
反對 回復 2022-08-02
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

應該只能使用基于整數的數學來執行此操作:

def findYint(x,y):
    return (y[0] * (x[1] - x[0]) - (y[1] - y[0]) * x[0])  // (x[1] - x[0])

這樣可以避免浮點算術及其精度約束。


查看完整回答
反對 回復 2022-08-02
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

分數和所有整數數學的重寫都很好。

對于真正的大整數,您可能會發現自己想要 https://pypi.org/project/gmpy/ 而不是內置int類型。我已經成功地用它來測試大素數。

或者,如果您確實想要帶有小數點的數字,請嘗試十進制。Decimal(“1”) - 例如。


查看完整回答
反對 回復 2022-08-02
  • 3 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號