guess_key2(cipher_text, word1, word2 ,word3): letter_frequency = get_letter_frequency(cipher_text.lower()) excluded_letters = [letter for letter in letter_frequency.keys() if letter_frequency[letter] == 0] sorted_letters = sorted([letter for letter in letter_frequency.keys() if letter_frequency[letter] > 0], key=lambda x: letter_frequency[x], reverse=True) print("Excluded letters:", excluded_letters) print() #if len(excluded_letters)<5 most_common_letters_m = [sorted_letters[15:21] ,sorted_letters[10:15] ,sorted_letters[7:10], sorted_letters[1:7]] #反向 #f1 = ['e'] f2 = ['a', 'i', 'r', 't', 'o', 'n'] f3 = ['s', 'l', 'c'] f4 = ['u', 'p', 'm', 'd', 'h'] f5 = ['g', 'b', 'y', 'f', 'v', 'w'] f6 = ['k', 'x', 'z', 'q', 'j'] mf = [f5, f4, f3, f2] mp = [[j for j in range(len(mf[i]))] for i in range(len(mf))] flag = True while(flag): key = { sorted_letters[0]: 'e'} row_permutations = [itertools.permutations(row) for row in mp] matrix_permutations = itertools.product(*row_permutations) for permutation in matrix_permutations: for i in range(len(mp)): for j in range(len(mp[i])): key[most_common_letters_m[i][permutation[i][j]]] = mf[i][j] if len(key) < len (sorted_letters): for i in range (len(sorted_letters)-len(key)): key.update({sorted_letters[len(key)+i-1]:f6[i]}) decrypted_text = decrypt(cipher_text, key) if is_plaintext(decrypted_text, word1, word2 ,word3): flag=False return key时间复杂度是否过高?
时间: 2024-03-14 17:49:04 浏览: 80
这段代码的时间复杂度非常高,因为它使用了多重嵌套的循环和迭代器,这会导致执行时间随着输入数据的增加而指数级增加。具体来说,这段代码的时间复杂度是O(N^M),其中N是字母表中字母的数量,M是最常见的字母组合的数量。如果输入的密文很长,这个时间复杂度可能会变得非常大。因此,这段代码应该尽可能地避免重复计算,以及尝试减少嵌套循环的数量。
相关问题
import f if __name__ == '__main__': word1 = load_word1() word2 = load_word2() word3 = load_word3() cipher_text = load_cipher_text() #print(decrypt(cipher_text, key)) print(get_letter_frequency(cipher_text.lower())) key = guess_key3(cipher_text, word1, word2, word3) print(key) decrypted_text = decrypt(cipher_text, key) print(decrypted_text)无法引用的原因可能是?
如果你的代码无法引用 `f` 模块,那么有可能是以下原因导致的:
1. 模块文件名不正确:如果你使用了 `import f` 语句,那么 Python 会查找名为 `f.py` 的模块文件。请确保你的模块文件名与代码中使用的文件名一致。
2. 模块文件路径不正确:如果你的模块文件不在与主函数所在文件相同的目录下,那么你需要指定正确的路径。你可以使用相对路径或绝对路径来指定模块文件的位置。
3. 模块文件中没有定义需要的函数:如果你的模块文件中没有定义你需要的函数,那么你无法在主函数中引用它们。请确保你的模块文件中定义了你需要的函数。
4. 模块文件中的函数名与主函数中的函数名冲突:如果你在模块文件和主函数中都定义了同名的函数,那么可能会导致命名冲突。在这种情况下,你需要使用不同的函数名来避免冲突。
5. 模块文件中存在语法错误:如果你的模块文件中存在语法错误,那么 Python 无法正确解析模块文件并导入其中的函数。请检查你的模块文件,确保它没有语法错误。
如果你遇到了无法引用模块的问题,可以逐个排除以上原因,找出问题所在。
def guess_key(cipher_text, words): letter_frequency = get_letter_frequency(cipher_text.lower()) sorted_letters = sorted(letter_frequency.keys(), key=lambda x: letter_frequency[x], reverse=True) most_common_letters = sorted_letters[:6] for i in range(len(most_common_letters)): for j in range(i+1, len(most_common_letters)): for k in range(j+1, len(most_common_letters)): key = {most_common_letters[i]: 'e', most_common_letters[j]: 't', most_common_letters[k]: 'a'} decrypted_text = decrypt(cipher_text, key) if is_plaintext(decrypted_text, words): return key
这段代码实现了一个猜测密钥的算法,它接受两个参数:`cipher_text`(密文)和 `words`(单词列表),并返回一个字典类型的对象,表示猜测的密钥。
算法的实现原理是首先统计密文中每个字母出现的频率,然后按照频率从高到低排序,选取出现频率最高的 6 个字母作为备选字母。接下来,对于这 6 个字母中的任意 3 个字母,猜测它们分别对应明文中的 'e'、't'、'a' 三个字母,得到一个可能的密钥。然后使用这个密钥解密密文,判断解密后的明文是否合法,如果合法,则返回这个密钥。
需要注意的是,这个算法可能会产生错误的猜测,因为只是根据字母频率进行猜测,没有考虑其他语言特征(如单词长度、语法结构等)。因此,猜测的密钥不一定是正确的,需要进一步进行验证和调整。
阅读全文