Algorithm 查找总和为0 mod n的数组
存在长度为m的数组,其中所有条目都是正(>=0)整数。我希望条目的总和为0 mod n 我想要一个所有这些数组的列表,其中条目的平方和小于k 我该怎么做?我想不出一种方法可以找到所有这样的数组,只是其中的一部分Algorithm 查找总和为0 mod n的数组,algorithm,Algorithm,存在长度为m的数组,其中所有条目都是正(>=0)整数。我希望条目的总和为0 mod n 我想要一个所有这些数组的列表,其中条目的平方和小于k 我该怎么做?我想不出一种方法可以找到所有这样的数组,只是其中的一部分 我可以展示我用python写的东西,但是我的方法有缺陷,我需要从头开始,所以除非有人要求,否则我不会展示它。我现在只能想到一个非常暴力的解决方案。让我举一个实数的例子。设m=4,n=5,k=25。因此,您需要迭代所有数组,并针对每个位置,测试从1到给定范围u的所有数字。 为了计算这个u,
我可以展示我用python写的东西,但是我的方法有缺陷,我需要从头开始,所以除非有人要求,否则我不会展示它。我现在只能想到一个非常暴力的解决方案。让我举一个实数的例子。设m=4,n=5,k=25。因此,您需要迭代所有数组,并针对每个位置,测试从1到给定范围u的所有数字。 为了计算这个u,我考虑了这个。在这种最坏的情况下,您将遇到以下情况: [1 u] 这意味着3+u**2必须小于k。因此,我使用u作为int(sqrt(k-(m-1)))
清楚吗?以下三个观察结果将帮助您:
a_0 1:“array”在我看来没有使用2:comp中丢失的条目不正确,它并不总是0 mod n,平方和太大。
from math import sqrt
array = [1, 2, 3, 4]
comb = [0 for i in range(m)]
u = int(sqrt(k-m+1))
all_combs(comb, 0, 0, 0)
def all_combs(comb, pos, sum, square_sum):
global n, m, u, k
if (square_sum > k):
# Invalid case
return
if (pos == m):
if (sum % n == 0):
print comb
return
for i in range(1,u+1):
comb[pos] = i
all_combs(comb, pos + 1, sum + i, sum_square + i**2)
array := [0,...,0];
sqsum := sum_{j=0..m-1} array[j]^2;
for i := m-2...1 do {
array[i]++;
for j from i+1 to m-2 do
array[j] := array[i];
L := sum_{j=0..m-2} array[j] mod n;
array[m-1] := n-L;
sqsum := sum_{j=0..m-1} array[j]^2;
while sqsum < k do {
print(array);
sqsum := sqsum + 2*array[m-1]n+n^2;
array[m-1] := array[m-1]+n;
}
}