Prüfung auf zulässige Folgen


13

Zusammenfassung: Testen Sie, ob eine Eingabesequenz von ganzen Zahlen "zulässig" ist, was bedeutet, dass sie nicht alle Restklassen für einen beliebigen Modul abdeckt.

Was ist eine "zulässige" Reihenfolge?

Bei einer ganzen Zahl m ≥ 2 sind die Restklassen modulo m nur die m möglichen arithmetischen Verläufe der gemeinsamen Differenz m. Wenn beispielsweise m = 4 ist, sind die 4 Restklassen Modulo 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, ...

Die k-te Restklasse besteht aus allen ganzen Zahlen, deren Rest bei Division durch m gleich k ist. (solange man "rest" für negative ganze Zahlen korrekt definiert)

Eine Folge von ganzen Zahlen a1, a2, ..., ak ist modulo m zulässig, wenn sie mindestens eine der Restklassen nicht schneidet. Beispielsweise sind {0, 1, 2, 3} und {-4, 5, 14, 23} kein zulässiges Modulo 4, sondern {0, 1, 2, 4} und {0, 1, 5, 9} und {0, 1, 2, -3} sind zulässig modulo 4. auch {0, 1, 2, 3, 4} ist nicht zulässig , modulo 4, während {0, 1, 2} ist zulässig modulo 4.

Schließlich ist eine Folge von ganzen Zahlen einfach zulässig, wenn sie für jede ganze Zahl m ≥ 2 modulo m zulässig ist.

Die Herausforderung

Schreiben Sie ein Programm oder eine Funktion, die eine Folge von ganzen Zahlen als Eingabe verwendet und einen (konsistenten) Wahrheitswert zurückgibt, wenn die Folge zulässig ist, und einen (konsistenten) falschen Wert, wenn die Folge nicht zulässig ist.

Die Eingabesequenz von Ganzzahlen kann in jedem vernünftigen Format vorliegen. Sie können davon ausgehen, dass die Eingabesequenz mindestens zwei Ganzzahlen enthält. (Sie können auch davon ausgehen, dass die Eingabe-Ganzzahlen unterschiedlich sind, obwohl dies wahrscheinlich nicht hilft.) Sie müssen in der Lage sein, positive und negative Ganzzahlen (und 0) zu verarbeiten.

Übliche Wertung: Die kürzeste Antwort in Bytes gewinnt.

Probeneingabe

Die folgenden Eingabesequenzen sollten jeweils einen Wahrheitswert enthalten:

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

Die folgenden Eingabesequenzen sollten jeweils einen Falsy-Wert ergeben:

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

Tipps

  • Es ist zu beachten, dass jede Folge von 3 oder weniger ganzen Zahlen automatisch als Modulo 4 zulässig ist. Im Allgemeinen ist eine Folge der Länge k automatisch als Modulo m zulässig, wenn m> k ist. Daraus folgt, dass für die Prüfung der Zulässigkeit nur eine endliche Anzahl von m geprüft werden muss.
  • Man beachte auch, dass 2 4 teilt und dass jede Sequenz, die zulässiges Modulo 2 ist (dh alle geraden oder alle ungeraden), automatisch zulässiges Modulo 4 ist. Allgemeiner gesagt, wenn m n teilt und eine Sequenz zulässiges Modulo m ist, dann ist es dies automatisch zulässiges Modulo n. Zur Prüfung der Zulässigkeit genügt es daher, auf Wunsch nur Primzahl m zu berücksichtigen.
  • Wenn a1, a2, ..., ak eine zulässige Folge ist, dann ist a1 + c, a2 + c, ..., ak + c auch für eine beliebige ganze Zahl c (positiv oder negativ) zulässig.

Mathematische Relevanz (optionales Lesen)

Sei a1, a2, ... eine Folge von ganzen Zahlen. Angenommen, es gibt unendlich viele ganze Zahlen n, so dass n + a1, n + a2, ..., n + ak alle Primzahlen sind. Dann ist es einfach zu zeigen, dass a1, a2, ..., ak zulässig sein muss. Nehmen wir in der Tat an, dass a1, a2, ..., ak nicht zulässig ist, und lassen Sie m eine Zahl sein, so dass a1, a2, ..., ak nicht zulässig ist, modulo m. Dann muss, egal für welches n wir uns entscheiden, eine der Zahlen n + a1, n + a2, ..., n + ak ein Vielfaches von m sein und kann daher keine Primzahl sein.

Die primäre k-Tupel-Vermutung ist die Umkehrung dieser Aussage, die in der Zahlentheorie immer noch ein weit offenes Problem darstellt: Wenn a1, a2, ..., ak eine zulässige Folge (oder k-Tupel ) ist, dann liegt diese vor sollte unendlich viele ganze Zahlen n sein, so dass n + a1, n + a2, ..., n + ak alle Primzahlen sind. Zum Beispiel liefert die zulässige Folge 0, 2 die Aussage, dass es unendlich viele ganze Zahlen n geben sollte, so dass sowohl n als auch n + 2 Primzahlen sind. Dies ist die Doppelprimen-Vermutung (noch nicht bewiesen).


3
[_60:0:60:120:180]gibt mir wahr; in der Tat schneidet es nicht mindestens eine Klasse in jedem mvon 2bis 5einschließlich; Außerdem schneidet es nur eine Klasse in jeder mvon 2bis 5einschließlich.
Undichte Nonne

1
Ich habe das gleiche für [-60, 0, 60, 120, 180] wie @LeakyNun dies sollte zulässig sein.
Karl Napf

-60 0 60 120 180 240 300schneidet jede Restklasse modulo 7, ist also nicht zulässig.
Greg Martin

Könnten wir längere Testfälle haben?
Undichte Nonne

@LeakyNun: Für jedes m bilden die ersten m Primzahlen, die größer als m sind, eine zulässige Folge. (Der vorletzte Wahrheitstestfall ist ein Beispiel dafür mit m = 7.) Falsche Testfälle können erzeugt werden, indem mit den ganzen Zahlen 1, ..., m begonnen wird, k ≤ m ausgewählt und ein zufälliges Vielfaches von hinzugefügt wird k auf eine oder alle der Startzahlen 1, ..., m.
Greg Martin

Antworten:



7

Brachylog , 25 24 19 Bytes

5 Bytes dank Karl Napf.

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

Probieren Sie es online!

Überprüfen Sie alle Testfälle!

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

Python, 61 60 Bytes

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

Alle Testfälle auf ideone

Bearbeiten: Ersetzt logisch und mit bitweise &, um ein Byte zu speichern


2

JavaScript (ES6), 59 Byte

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

Verwendet den Reststrick von @ KarlNapf.


1
Nun, es ist kein Trick, nur Mathematik ;-)
Karl Napf

2

Python, 67 64 Bytes

Als unbenanntes Lambda:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • Edit1: ersetzt set()durch{}
  • Edit2: Benötige keine eckigen Klammern um Generator in all(...)
  • Edit3: Wie von Jonathan Allan hervorgehoben, rangemuss auf gehenlen(N)+1

Alter Code als Funktion (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

1
Hiermit gebe ich Ihnen Credits für Ihre Vorgehensweise, die mir 5 Bytes gespart hat.
Undichte Nonne

@LeakyNun Gern geschehen!
Karl Napf

2

Mathematica, 51 Bytes

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

2

MATL , 11 Bytes

"X@QGy\un>v

Wahrheit ist ein Array (Spaltenvektor), das alle enthält. Falsy ist ein Array, das mindestens eine Null enthält. Sie können diese Definitionen über diesen Link überprüfen .

Probieren Sie es online! Oder überprüfen Sie alle Testfälle: wahr , falsch (leicht veränderter Code, jeder Fall erzeugt einen horizontalen Vektor zur Verdeutlichung).

Erläuterung

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

Ich orientiere mich immer noch an dieser Stelle, entschuldige mich also, wenn dies eine häufig gestellte Frage ist, aber: Ich würde denken, dass wahrheitsgemäße / falsche Werte tatsächliche Konstanten irgendeiner Art sein sollten, nicht Muster wie "ein Array, das at enthält mindestens eine Null ". Sollte man das Array nicht verarbeiten (in diesem Fall bitweise UND verwenden), um am Ende zu Konstanten zu gelangen?
Greg Martin

@ GregMartin Das ist eine sehr gute Frage. Wir sind uns ziemlich einig über die Antwort; siehe hier
Luis Mendo

1
Verstanden, und jetzt sehe ich den Punkt Ihres ersten Links. Danke für die Erklärung!
Greg Martin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.