测试允许序列


13

内容提要:测试整数的输入序列是否为“允许的”,这意味着它不涵盖任何模数的所有残基类别。

什么是“允许”序列?

给定一个整数m≥2,模m残基类别就是公共差m的m个可能的算术级数。例如,当m = 4时,模4的4个残基类别为

..., -8, -4, 0, 4, 8, 12, ...
..., -7, -3, 1, 5, 9, 13, ...
..., -6, -2, 2, 6, 10, 14, ...
..., -5, -1, 3, 7, 11, 15, ...

第k个残基类由所有整数组成,所有整数除以m等于k。(只要为负整数正确定义“余数”)

如果整数a1,a2,...,ak的序列未能与至少一个残基类别相交,则该序列可取m模。例如,{0,1,2,3}和{-4,5,14,23} 不允许以 4 为模,但是{0,1,2,4}和{0,1,5,9}和{0,1,2,-3} 模4的允许值。此外,{0,1,2,3,4}是模4的不允许值,而{0,1,2} 模4的可接受值。

最后,如果每个整数m≥2都可以模m取整数,则整数序列只是允许的。

挑战

编写一个程序或函数,该程序或函数将整数序列作为输入,如果该序列是允许的,则返回一个(一致的)Truthy值,如果该序列不可接受的,则返回一个(一致的)Falsy值。

整数的输入序列可以采用任何合理的格式。您可以假设输入序列至少包含两个整数。(虽然可能没有帮助,但是您也可以假设输入整数是不同的,尽管这可能无济于事。)您必须能够处理正整数和负整数(和0)。

通常的评分:最短的答案(以字节为单位)获胜。

样品输入

以下输入序列应分别提供一个Truthy值:

0 2
-1 1
-100 -200
0 2 6
0 2 6 8
0 2 6 8 12
0 4 6 10 12
-60 0 60 120 180
0 2 6 8 12 26
11 13 17 19 23 29 31
-11 -13 -17 -19 -23 -29 -31

以下输入序列应分别提供Falsy值:

0 1
-1 4
-100 -201
0 2 4
0 2 6 10
0 2 6 8 14
7 11 13 17 19 23 29
-60 0 60 120 180 240 300

提示

  • 请注意,任何3个或更少整数的序列都将自动允许取模4。更一般地说,当m> k时,长度为k的序列将自动允许模m。由此可见,测试可接纳性实际上仅需要检查有限数量的m。
  • 还要注意2除以4,并且任何可取模2的序列(即所有偶数或全奇数)都将自动被允许取模4。更普​​遍的是,如果m除n且一个序列可取模m,则它是自动允许的模数n。因此,要检查可否受理性,只要您愿意,仅考虑素数就足够了。
  • 如果a1,a2,...,ak是可允许的序列,则a1 + c,a2 + c,...,ak + c也可用于任何整数c(正数或负数)。

数学相关性(可选阅读)

令a1,a2,...,ak为整数序列。假设存在无限多个整数n,使得n + a1,n + a2,...,n + ak均为素数。然后可以很容易地证明a1,a2,...,ak必须是可接受的。实际上,假设a1,a2,...,ak是不允许的,并且让m为一个数字,使得a1,a2,...,ak对m取模是不允许的。那么无论我们选择什么n,数字n + a1,n + a2,...,n + ak之一必须是m的倍数,因此不能为素数。

黄金k元组猜想是这样的说法,这仍然是数论中一个敞开的问题相反:它断言,如果A1,A2,...,AK是一个容许序列(或K-元组),则有应该是无限多个整数n,使得n + a1,n + a2,...,n + ak都是素数。例如,可允许的序列0,2得出这样的结论:应该有无限多的整数n使得n和n + 2都是素数,这是孪生素数猜想(仍然未经证明)。


3
[_60:0:60:120:180]给我真实;事实上,它不相交的每一个至少一类m来自25包容性; 此外,它m从每个25包含范围都仅相交一个类。
Leaky Nun

1
对于[-60、0、60、120、180],我与@LeakyNun相同,这应该是可以接受的。
Karl Napf

-60 0 60 120 180 240 300与每个残差类别以7为模相交,因此它是不允许的。
格雷格·马丁

我们可以有更长的测试用例吗?
Leaky Nun

@LeakyNun:对于任何m,大于m的前m个素数形成一个可允许的序列。(倒数第二个Truthy测试用例是m = 7的一个示例。)可以通过以整数1,...,m开头,选择k≤m并加上的随机倍数来生成虚假的测试用例。 k代表任意或所有起始整数1,...,m。
格雷格·马丁

Answers:


4

果冻,10个字节

JḊðḶḟ%@ð€Ạ

在线尝试!运行所有测试用例

               Input: L.
JḊ             Range of [2..len(L)].
  ð    ð€      For x in [2..len(L)]:
   Ḷ             [0..x-1] (residue classes)
    ḟ              without elements from
     %@            L % x.
         Ạ     All truthy (non-empty)?

7

Brachylog25 24 19字节

感谢Karl Napf提供5个字节。

lybb'(eM-yA,?:[M] z:%aodA)
l:2'(eM-yA,?:[M] z:%aodA)
l:2'(eMg:?rz:%adlM)

在线尝试!

验证所有测试用例!

l:2'(eMg:?rz:%adlM)
l:2                  Temp = [2:length(input)]
   '(             )  true if the following cannot be proven:
     eM                  M is an element of the interval
                         indicated by Temp, i.e. from 2
                         to the length of input inclusive,
       g:?rz:%adlM       every element of input modulo M
                         de-duplicated has length M.

4

蟒蛇, 61 60字节

q=lambda l,d=2:d>len(l)or q(l,d+1)&(len({v%d for v in l})<d)

ideone上的所有测试用例

编辑:用逻辑和按位&替换​​以节省一个字节


2

JavaScript(ES6),59个字节

a=>a.every((_,i)=>!i++|new Set(a.map(e=>(e%i+i)%i)).size<i)

使用@KarlNapf的余数技巧。


1
好吧,这不是把戏,只是数学;-)
Karl Napf

2

Python,67 64字节

作为未命名的lambda:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • Edit1:替换set(){}
  • Edit2:在生成器中不需要方括号 all(...)
  • Edit3:正如乔纳森·艾伦(Jonathan Allan)指出的那样rangelen(N)+1

旧代码作为函数(96字节):

def f(N):
 for m in range(2,len(N)+1):
    if len(set(i%m for i in N))==m:return False
 return True

1
在此,我为您节省了5个字节的方法提供了功劳。
Leaky Nun

@LeakyNun不客气!
Karl Napf

2

Mathematica,51个字节

And@@Table[Length@Union@Mod[#,i]<i,{i,2,Length@#}]&

2

MATL,11个字节

"X@QGy\un>v

Truthy是一个包含所有数组的数组(列向量)。Falsy是一个至少包含一个零的数组。您可以使用此链接检查这些定义。

在线尝试!或验证所有测试用例:正确错误(略作修改的代码,为清楚起见,每种情况都会产生一个水平向量)。

说明

"       % Take input array. For each; i.e. repeat n times, where n is arrray size
  X@Q   %   Push iteration index plus 1, say k. So k is 2 in the first iteration,
        %   3 in the second, ... n+1 in the last. Actually we only need 2, ..., n;
        %   but the final n+1 doesn't hurt
  G     %   Push input again
  y     %   Duplicate k onto the top of the stack
  \     %   Modulo. Gives vector of remainders of input when divided by k
  un    %   Number of distinct elements
  >     %   True if that number is smaller than k
  v     %   Vertically concatenate with previous results
        % End for each. Implicitly display 

我仍然在这个站点上适应问题,如果这是一个很好的问题类型,请您道歉,但是:我认为true / falsy值应该是某种实际的常量,而不是诸如“包含至少一个零”。一个人不应该处理数组(在这种情况下使用按位与)最后得出常量吗?
格雷格·马丁

@GregMartin这是一个很好的问题。我们对它的答案有相当牢固的共识。看到这里
Luis Mendo

1
知道了,现在我看到了您的第一个链接。感谢您的解释!
格雷格·马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.