根据自然数的余数序列求正整数

发布于 2022-09-12 03:25:13 字数 155 浏览 30 评论 0

有未知正整数 n,给出它对自然数 i(范围:1-300) 的余数 r 序列,求 n 。

即,已知 ri

r1 = n % 1
r2 = n % 2
r3 = n % 3
...
ri = n % i
...

求 n。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

饮惑 2022-09-19 03:25:13

感谢 @萝卜 提示,采用中国剩余定理解法如下

import random
import math


def mod_inv(a, m):
    '''求 a 模 m 的数论倒数 n,即 (a*n) % m = 1'''
    a = a % m
    for x in range(1, m):
        if ((a * x) % m == 1):
            return x
    return 1


def is_prime(n):
    '''判断 n 是否为素数'''
    m = int(math.sqrt(n))
    for i in range(2, m + 2):
        if n % i == 0:
            return False
    return True


def all_prime_before(n):
    '''查找 n 以内的所有素数'''
    ps = []
    for i in range(2, n+1):
        if is_prime(i):
            ps.append(i)
    return ps


def resolve(ps, rs):
    # 限制猜数范围,不超过 8 位字节。
    k = 1
    ki = 0
    for i, v in enumerate(ps):
        if k*v > 0xffffffff:
            break
        k *= v
        ki = i
    print(f'+ 截取素数个数:{ki}, 积:{k}')

    ret = 0
    for idx, i in enumerate(ps):
        if idx > ki:
            break
        a = k // i
        b = mod_inv(a, i)
        ret = (ret + a * b * rs[idx]) % k
    return ret


def main():
    ps = all_prime_before(300)
    print('+ 素数列表:', ps)

    n = random.randint(0xffff, 0xffffffff)
    print('+ 随机数:', n)

    # 余数列表
    rs = []
    for i in ps:
        rs.append(n % i)

    m = resolve(ps, rs)
    print('+ 结果:', m)

    if m != n:
        raise Exception('结果不符')


if __name__ == '__main__':
    main()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文