2016-02-23 84 views
-2

我有以下一段代碼不符合我的要求。如何提高此算法的效率?

def cipher(plaintext, arr): 
    import math 
    ciphered = [] 
    for letter in plaintext: 
     ciphered.append(math.pow(ord(letter)-65,arr[1]%arr[0])) 
    return ciphered 

那些獲得到math.pow的參數是142和35。然後,它使用的是結果找到模塊221然而,結果它給我的是206.0當結果,它應該給我是12.即使當我在wolfram alpha中找到這個結果時,結果是12.我認爲這裏的問題與溢出問題有關。但是我不知道如何解決它

+0

給我們一些'plaintext'和'arr'的樣本值,以及期望的輸出。 –

+0

提高效率並沒有給你正確的答案是兩件不同的事情。一般來說,程序員會告訴你先讓它工作,然後優化算法......無論如何,只要提高它的效率,要考慮的一件事就是取消調用導入數學的操作。導入一個庫需要很多時間;如果你需要調用500,000次這樣的函數,那將是非常低效的。相反,你可以在函數中使用Python中原生的簡單操作和對象來實現你想要的功能..無論如何應該讓你開始 –

+2

其中一個結束括號應該在'%arr [0]'之前,而不是之後。或者你可以用''替換'%',以使用快速模冪運算。 –

回答

2

你正在嘗試建立被稱爲模冪,並且有一個優化的算法,這將避免精度損失,並隨後不正確的結果:

def pow_mod(b, e, m): 
    """Compute (b^e) mod m.""" 
    c, e_ = 1, 0 
    while e_ < e: 
     e_ += 1 
     c = (b*c) % m 
    return c 

編輯(謝謝,@ user2357112): ...或者你可以使用內置的pow,這已經做到了。但是,當你問及如何提高效率時,就是這樣。

+2

這已經與Python;當你給它3個參數時,它是內建的'pow'(而不是特定的浮點'math.pow')。 – user2357112

+0

@ user2357112 TIL – L3viathan