如何处理计算然后验证10 ^ 8个解决方案以找到一个真实答案?

时间:2019-04-10 06:13:55

标签: python gmpy

我有一个615位数字的数字。在整个数字中,有8个固定的地方缺少数字。我必须找到那些丢失的数字。因此,存在10 ^ 8的可能性。计算完它们后,我必须为每个可能的数字加一个密文,并查看输出是什么(mod N),并查看哪个数字给出正确的输出。换句话说,我正在尝试在RSA问题中找到解密密钥。我目前最关心的是如何有效/正确地创建所有10 ^ 8个可能的答案。

我正在使用gmpy2,为了使其正常工作,我不得不下载Python2.7只是为了在尝试安装gmpy2时不会出错。我希望他们足够解决这个问题。如果没有,我真的很感谢有人指出我正确的方向。

我尚未尝试任何操作,因为我确定这将需要数小时才能计算出来。因此,我真的想确保我做的所有事情都正确无误,这样,如果我让笔记本电脑运行几个小时,就不会弄乱内部,也不会冻结,而且我会坐在这里,不知道笔记本电脑是否弄乱了,或者仍在计算中。

因此,我想我正在寻求有关如何继续进行的建议。

就实际代码而言,我想0-9循环8次并不难,但是我不知道如何将一个数字转换为另一个数字。在Python中,我该如何做,以便仅将数字插入到我需要的位置?该数字如下例所示:

X = 124621431523_13532535_62635292 //this is only 30 digits long, mine is 615 digits long

每个“ _”都缺少数字的地方。

我完全不知道该怎么做。

一旦生成了所有数字,我就打算遍历所有数字并将其提高直到得到所需的答案。这部分似乎更容易一些,因为它似乎只是一个简单的循环。

所以我想我的主要问题是如何遍历10 ^ 8个数字,但是如何将它们放在已经有615位数字的数字中的特定位置?我正在寻求有关技术以及代码设计的建议,以免花费太长时间即可全部生成它们。

感谢您阅读。

2 个答案:

答案 0 :(得分:2)

将数字转换为字符串,使用format方法,使用itertools.product生成数字以填充空洞,然后将其返回。

示例:

from itertools import product

def make_seed(n, replace_positions):
    seed = str(n)
    to_replace = [-1] + replace_positions
    substrings = [seed[start + 1:end] 
                  for start, end 
                  in zip(to_replace, to_replace[1:])] + [seed[to_replace[-1] + 1:]]
    return '{}'.join(substrings)

def make_number(seed):
    n = seed.count('{}')
    for numbers in product([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], repeat=n):
        yield int(seed.format(*numbers))


seed = make_seed(123456789, [3, 5, 7])
# seed = '123{}5{}7{}9'

for i in make_number(seed):
    print(i)

输出:

123050709
123050719
123050729
123050739
123050749
123050759
123050769
123050779
123050789
123050799
123051709
123051719
123051729
...

答案 1 :(得分:1)

由于十进制数字仅是digit * pow(10, n)的总和,因此您可以假定未知数字为零,并将其与数字乘积相加

#   124621431523_13532535_62635292 this is the original digit
x = 124621431523013532535062635292
positions = [8,17] # the missing digits are the 8th and 17th digits from the right

from itertools import product
trials = product(range(0,10), repeat=2)
for t in trials:
    x_prime = x
    for (digit, pos) in zip(t, positions):
        x_prime = x_prime + digit * pow(10, pos)
    print(x_prime) # do your checking here

输出:

124621431523013532535062635292
124621431523113532535062635292
124621431523213532535062635292
124621431523313532535062635292
...
etc