Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找总和为0 mod n的数组_Algorithm - Fatal编程技术网

Algorithm 查找总和为0 mod n的数组

Algorithm 查找总和为0 mod n的数组,algorithm,Algorithm,存在长度为m的数组,其中所有条目都是正(>=0)整数。我希望条目的总和为0 mod n 我想要一个所有这些数组的列表,其中条目的平方和小于k 我该怎么做?我想不出一种方法可以找到所有这样的数组,只是其中的一部分 我可以展示我用python写的东西,但是我的方法有缺陷,我需要从头开始,所以除非有人要求,否则我不会展示它。我现在只能想到一个非常暴力的解决方案。让我举一个实数的例子。设m=4,n=5,k=25。因此,您需要迭代所有数组,并针对每个位置,测试从1到给定范围u的所有数字。 为了计算这个u,

存在长度为m的数组,其中所有条目都是正(>=0)整数。我希望条目的总和为0 mod n

我想要一个所有这些数组的列表,其中条目的平方和小于k

我该怎么做?我想不出一种方法可以找到所有这样的数组,只是其中的一部分


我可以展示我用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;
      }
    }