Prueba de secuencias admisibles

13

Resumen ejecutivo: pruebe si una secuencia de entrada de enteros es "admisible", lo que significa que no cubre todas las clases de residuos para ningún módulo.

¿Qué es una secuencia "admisible"?

Dado un número entero m ≥ 2, las clases de residuos módulo m son solo las posibles progresiones aritméticas de diferencia común m. Por ejemplo, cuando m = 4, las 4 clases de residuos módulo 4 son

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

La clase de residuo k consta de todos los enteros cuyo resto al dividir por m es igual a k. (siempre y cuando uno defina "resto" correctamente para enteros negativos)

Una secuencia de enteros a1, a2, ..., ak es admisible módulo m si no logra intersecar al menos una de las clases de residuos. Por ejemplo, {0, 1, 2, 3} y {-4, 5, 14, 23} no son admisibles módulo 4, pero {0, 1, 2, 4} y {0, 1, 5, 9} y {0, 1, 2, -3} son admisibles módulo 4. Además, {0, 1, 2, 3, 4} no es admisible módulo 4, mientras que {0, 1, 2} es admisible módulo 4.

Finalmente, una secuencia de enteros es simplemente admisible si es admisible módulo m para cada entero m ≥ 2.

El reto

Escriba un programa o función que tome una secuencia de enteros como entrada, y devuelva un valor de Verdad (consistente) si la secuencia es admisible y un valor de Falsy (consistente) si la secuencia no es admisible.

La secuencia de entrada de enteros puede estar en cualquier formato razonable. Puede suponer que la secuencia de entrada tiene al menos dos enteros. (También puede suponer que los enteros de entrada son distintos si lo desea, aunque probablemente no ayude). Debe poder manejar enteros positivos y negativos (y 0).

Puntuación de habitual : la respuesta más corta, en bytes, gana.

Entrada de muestra

Las siguientes secuencias de entrada deberían dar un valor de Verdad:

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

Las siguientes secuencias de entrada deberían dar un valor de 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

Consejos

  • Tenga en cuenta que cualquier secuencia de 3 o menos enteros es automáticamente admisible módulo 4. Más generalmente, una secuencia de longitud k es automáticamente admisible módulo m cuando m> k. De ello se deduce que las pruebas de admisibilidad realmente solo requieren verificar un número finito de m.
  • Tenga en cuenta también que 2 divide 4, y que cualquier secuencia que sea admisible módulo 2 (es decir, todo par o todo impar) es automáticamente admisible módulo 4. Más generalmente, si m divide ny una secuencia es admisible módulo m, entonces es módulo admisible automáticamente n. Para verificar la admisibilidad, por lo tanto, es suficiente considerar solo prime m si lo desea.
  • Si a1, a2, ..., ak es una secuencia admisible, entonces a1 + c, a2 + c, ..., ak + c también es admisible para cualquier número entero c (positivo o negativo).

Relevancia matemática (lectura opcional)

Deje a1, a2, ..., ak ser una secuencia de enteros. Suponga que hay infinitos enteros n tales que n + a1, n + a2, ..., n + ak son primos. Entonces es fácil demostrar que a1, a2, ..., ak deben ser admisibles. De hecho, suponga que a1, a2, ..., ak no es admisible, y sea m un número tal que a1, a2, ..., ak no sea admisible módulo m. Entonces, no importa qué n elijamos, uno de los números n + a1, n + a2, ..., n + ak debe ser un múltiplo de m, por lo tanto, no puede ser primo.

La conjetura principal de k-tuplas es la inversa de esta afirmación, que sigue siendo un problema abierto en la teoría de números: afirma que si a1, a2, ..., ak es una secuencia admisible (o k-tupla ), entonces existe deben ser infinitos números enteros n tales que n + a1, n + a2, ..., n + ak son primos. Por ejemplo, la secuencia admisible 0, 2 arroja la afirmación de que debería haber infinitos números enteros n de modo que tanto n como n + 2 sean primos, esta es la conjetura de los primos gemelos (aún sin probar).

Greg Martin
fuente
3
[_60:0:60:120:180]me está dando la verdad; de hecho, no se cruza al menos una clase en cada mdesde 2hasta 5inclusivo; Además, se cruza con una sola clase en cada mdesde 2hasta 5inclusiva.
Leaky Nun
1
Tengo lo mismo para [-60, 0, 60, 120, 180] como @LeakyNun, esto debería ser admisible.
Karl Napf
-60 0 60 120 180 240 300intersecta cada clase de residuo módulo 7, por lo que no es admisible.
Greg Martin
¿Podríamos tener más casos de prueba?
Leaky Nun
@LeakyNun: para cualquier m, los primeros m primos más grandes que m forman una secuencia admisible. (El penúltimo caso de prueba de Verdad es un ejemplo de esto con m = 7.) Los casos de prueba de falsa se pueden generar comenzando con los enteros 1, ..., m, eligiendo k ≤ m y agregando múltiplos aleatorios de k a cualquiera o todos los enteros iniciales 1, ..., m.
Greg Martin

Respuestas:

7

Brachylog , 25 24 19 bytes

5 bytes gracias a Karl Napf.

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

Pruébalo en línea!

¡Verifique todos los casos de prueba!

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.
Monja permeable
fuente
4

Pitón, 61 60 bytes

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

Todos los casos de prueba en ideona

Editar: reemplazado lógico y con bit a bit y para guardar un byte

Jonathan Allan
fuente
2

JavaScript (ES6), 59 bytes

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

Utiliza el truco Conjunto de residuos de @ KarlNapf.

Neil
fuente
1
Bueno, no es un truco, solo matemáticas ;-)
Karl Napf
2

Python, 67 64 bytes

Como lambda sin nombre:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • Edit1: reemplazado set()con{}
  • Edit2: no necesita corchetes alrededor del generador en all(...)
  • Edit3: como señaló Jonathan Allan, rangedebe subir alen(N)+1

Código antiguo como función (96 bytes):

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
Karl Napf
fuente
1
Por la presente le doy créditos por su enfoque que me ahorró 5 bytes.
Leaky Nun
@LeakyNun ¡De nada!
Karl Napf
2

Mathematica, 51 bytes

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

MATL , 11 bytes

"X@QGy\un>v

La verdad es una matriz (vector de columna) que contiene todas. Falsy es una matriz que contiene al menos un cero. Puede verificar estas definiciones usando este enlace .

Pruébalo en línea! O verifique todos los casos de prueba: verdadero , falso (código ligeramente modificado, cada caso produce un vector horizontal para mayor claridad).

Explicación

"       % 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 
Luis Mendo
fuente
Todavía me estoy orientando en este sitio, así que disculpen si este es un tipo de pregunta bien formulada, pero: creo que los valores de verdad / falsedad deberían ser constantes reales de algún tipo, no patrones como "una matriz que contiene menos un cero ". ¿No debería uno procesar la matriz (usando AND a nivel de bits en este caso) para llegar a las constantes al final?
Greg Martin
@ GregMartin Esa es una muy buena pregunta. Tenemos un consenso bastante sólido sobre su respuesta; ver aquí
Luis Mendo
1
Lo tengo, y ahora veo el punto de tu primer enlace. ¡Gracias por la explicación!
Greg Martin