在中国剩余定理告诉我们,我们总能找到一些能产生下不同的素模所需的任何剩余物。您的目标是编写代码以在多项式时间内输出这样的数字。最短的代码胜出。
例如,假设我们得到了以下约束(%
代表mod):
n % 7 == 2
n % 5 == 4
n % 11 == 0
一种解决方案是n=44
。第一个条件满足,因为44 = 6*7 + 2
,所以44
有剩余2
时,除以7
,因此44 % 7 == 2
。也满足了其他两个约束。还有其他解决方案,例如n=814
和n=-341
。
输入项
对的非空列表(p_i,a_i)
,其中每个模数p_i
是一个不同的质数,每个目标a_i
是该范围内的自然数0 <= a_i < p_i
。您可以采用任何方便的形式进行输入。它实际上不一定是对列表。您可能不认为输入已排序。
输出量
这样的整数n
,以便n % p_i == a_i
于每个索引i
。该值不必是最小值,也可以是负数。
多项式时间限制
为了防止廉价的解决方案,只是尝试n=0
,n=1
,n=2
,等等,你的代码必须在多项式时间在运行中输入的长度。请注意,m
输入中的数字具有length Θ(log m)
,因此m
其长度不是多项式。这意味着您最多不能计数m
或不能进行一次运算m
,但是可以对这些值进行算术运算。
您可能不会使用像一元这样的低效率输入格式来解决此问题。
其他禁令
不允许执行以下操作的内置函数:实现中国余数定理,求解方程式或因数。
您可以使用内置函数查找mod并进行模块化加法,减法,乘法和乘幂运算(使用自然数指数)。您可能不使用其他内置的模块化操作,包括模块化逆运算,除法和查找顺序。
测试用例
这些给出最小的非负解。您的答案可能有所不同。如果直接检查输出是否满足每个约束,可能会更好。
[(5, 3)]
3
[(7, 2), (5, 4), (11, 0)]
44
[(5, 1), (73, 4), (59, 30), (701, 53), (139, 112)]
1770977011
[(982451653, 778102454), (452930477, 133039003)]
68121500720666070