Test per sequenze ammissibili


13

Riepilogo: verifica se una sequenza di input di numeri interi è "ammissibile", nel senso che non copre tutte le classi di residui per nessun modulo.

Che cos'è una sequenza "ammissibile"?

Dato un numero intero m ≥ 2, le classi di residui modulo m sono solo le m possibili progressioni aritmetiche della differenza comune m. Ad esempio, quando m = 4, le 4 classi di residui modulo 4 sono

..., -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 kth classe di residui è costituita da tutti i numeri interi il cui resto alla divisione per m è uguale a k. (purché si definisca correttamente "resto" per numeri interi negativi)

Una sequenza di numeri interi a1, a2, ..., ak è ammissibile modulo m se non riesce a intersecare almeno una delle classi di residui. Ad esempio, {0, 1, 2, 3} e {-4, 5, 14, 23} non sono ammissibili modulo 4, ma {0, 1, 2, 4} e {0, 1, 5, 9} e {0, 1, 2, -3} sono ammissibili modulo 4. Inoltre, {0, 1, 2, 3, 4} non è ammissibile modulo 4, mentre {0, 1, 2} è ammissibile modulo 4.

Infine, una sequenza di numeri interi è semplicemente ammissibile se è ammissibile modulo m per ogni numero intero m ≥ 2.

La sfida

Scrivere un programma o una funzione che accetta una sequenza di numeri interi come input e restituisce un valore di Verità (coerente) se la sequenza è ammissibile e un valore di Falsia (coerente) se la sequenza non è ammissibile.

La sequenza di input di numeri interi può essere in qualsiasi formato ragionevole. Si può presumere che la sequenza di input abbia almeno due numeri interi. (Puoi anche supporre che gli interi di input siano distinti se vuoi, anche se probabilmente non aiuta.) Devi essere in grado di gestire numeri interi positivi e negativi (e 0).

Punteggio abituale : la risposta più breve, in byte, vince.

Input di esempio

Le seguenti sequenze di input dovrebbero ognuna dare un valore di Verità:

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

Le seguenti sequenze di input dovrebbero dare ciascuna un valore 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

Suggerimenti

  • Si noti che qualsiasi sequenza di 3 o meno numeri interi è automaticamente ammissibile modulo 4. Più in generale, una sequenza di lunghezza k è automaticamente ammissibile modulo m quando m> k. Ne consegue che la verifica della ricevibilità richiede in realtà solo la verifica di un numero finito di m.
  • Si noti inoltre che 2 divide 4 e che qualsiasi sequenza ammissibile modulo 2 (ovvero, tutto pari o dispari) è automaticamente ammissibile modulo 4. Più in generale, se m divide n e una sequenza è ammissibile modulo m, allora è modulo automaticamente ammissibile n. Per verificare l'ammissibilità, è quindi sufficiente prendere in considerazione solo il numero primo se lo si desidera.
  • Se a1, a2, ..., ak è una sequenza ammissibile, allora a1 + c, a2 + c, ..., ak + c è anche ammissibile per qualsiasi numero intero c (positivo o negativo).

Rilevanza matematica (lettura facoltativa)

Sia a1, a2, ..., ak una sequenza di numeri interi. Supponiamo che ci siano infiniti numeri interi n tali che n + a1, n + a2, ..., n + ak sono tutti primi. Quindi è facile dimostrare che a1, a2, ..., ak devono essere ammissibili. Supponiamo infatti che a1, a2, ..., ak non sia ammissibile e che m sia un numero tale che a1, a2, ..., ak non sia ammissibile modulo m. Quindi, qualunque cosa n scegliamo, uno dei numeri n + a1, n + a2, ..., n + ak deve essere un multiplo di m, quindi non può essere primo.

La congettura delle prime k-tuple è il contrario di questa affermazione, che è ancora un problema aperto nella teoria dei numeri: afferma che se a1, a2, ... ak è una sequenza ammissibile (o k-tupla ), allora c'è dovrebbe essere infinitamente numero intero n tale che n + a1, n + a2, ..., n + ak sono tutti primi. Ad esempio, la sequenza ammissibile 0, 2 fornisce l'affermazione secondo cui dovrebbero esserci infiniti numeri interi n tali che sia n che n + 2 siano primi, questa è la congettura di numeri primi gemelli (ancora non provata).


3
[_60:0:60:120:180]mi sta dando vero; anzi non interseca almeno una classe in ogni mda 2a 5inclusiva; inoltre, interseca solo una classe in ogni mda 2a 5compreso.
Leaky Nun,

1
Ho lo stesso per [-60, 0, 60, 120, 180] di @LeakyNun questo dovrebbe essere ammissibile.
Karl Napf,

-60 0 60 120 180 240 300interseca ogni classe di residui modulo 7, quindi non è ammissibile.
Greg Martin,

Potremmo avere prove più lunghe?
Leaky Nun,

@LeakyNun: per ogni m, i primi m primi più grandi di m formano una sequenza ammissibile. (Il penultimo test case di Truthy ne è un esempio con m = 7.) I casi test Falsy possono essere generati iniziando con gli interi 1, ..., m, scegliendo k ≤ m e aggiungendo multipli casuali di k a uno o tutti gli interi iniziali 1, ..., m.
Greg Martin,

Risposte:



7

Brachylog , 25 24 19 byte

5 byte grazie a Karl Napf.

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

Provalo online!

Verifica tutti i test!

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

Pitone, 61 60 byte

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

Tutti i casi di test su ideone

Modifica: sostituito logico e con bit per bit e per salvare un byte


2

JavaScript (ES6), 59 byte

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

Usa il trucco del set di resti di KarlNapf.


1
Bene, non è un trucco, solo matematica ;-)
Karl Napf

2

Python, 67 64 byte

Come lambda senza nome:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • Edit1: sostituito set()con{}
  • Edit2: non sono necessarie parentesi quadre attorno al generatore all(...)
  • Edit3: come sottolineato da Jonathan Allan, rangedeve salire alen(N)+1

Vecchio codice come funzione (96 byte):

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
Con la presente ti do crediti per il tuo approccio che mi ha salvato 5 byte.
Leaky Nun,

@LeakyNun Prego!
Karl Napf,

2

Mathematica, 51 byte

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

2

MATL , 11 byte

"X@QGy\un>v

Verità è un array (vettore di colonna) che contiene tutti quelli. Falsy è un array contenente almeno uno zero. Puoi controllare queste definizioni usando questo link .

Provalo online! Oppure verifica tutti i casi di test: verità , falsità (codice leggermente modificato, ogni caso produce un vettore orizzontale per chiarezza).

Spiegazione

"       % 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 

Mi sto ancora orientando su questo sito, quindi mi scuso se questo è un tipo di domanda ben fatto, ma: penso che i valori di verità / falsità dovrebbero essere costanti effettive di qualche tipo, non schemi come "un array che contiene almeno uno zero ". Uno non dovrebbe elaborare l'array (usando bit a bit in questo caso) per arrivare alle costanti alla fine?
Greg Martin,

@GregMartin Questa è un'ottima domanda. Abbiamo un consenso abbastanza solido sulla sua risposta; vedi qui
Luis Mendo

1
Capito, e ora vedo il punto del tuo primo link. Grazie per la spiegazione!
Greg Martin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.