Kabul edilebilir dizileri test etme


13

Yönetici özeti: bir tamsayı girdi dizisinin "kabul edilebilir" olup olmadığını test edin, yani herhangi bir modül için tüm kalıntı sınıflarını kapsamıyor demektir.

"Kabul edilebilir" sekans nedir?

M2 tamsayısı verildiğinde, kalıntı sınıfları modulo m ortak m farkının sadece m olası aritmetik ilerlemesidir. Örneğin, m = 4 olduğunda, 4 kalıntı sınıfı 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, ...

Kth kalıntı sınıfı, m ile bölündükten sonra kalan kısmı k'ye eşit olan tamsayılardan oluşur. (negatif tamsayılar için "kalan" ifadesi doğru olarak tanımlandığı sürece)

A1, a2, ..., ak tamsayıları dizisi , kalıntı sınıflarından en az birini kesemezse kabul edilebilir modülondur . Örneğin, {0, 1, 2, 3} ve {-4, 5, 14, 23} kabul edilebilir modülo 4 değildir , ancak {0, 1, 2, 4} ve {0, 1, 5, 9} ve {0, 1, 2, -3} vardır da kabul edilebilir modülo 4. {0, 1, 2, 3, 4} olduğu değil {0, 1, 2} ise, kabul edilebilir modülo 4 olduğu kabul modülo 4.

Son olarak, her tam sayı m ≥ 2 için kabul edilebilir modülo m olması halinde , bir tamsayı dizisi basitçe kabul edilebilir.

Meydan okuma

Bir tamsayı dizisini girdi olarak alan ve dizi kabul edilebilirse (tutarlı) bir Doğruluk değeri ve dizi kabul edilemezse (tutarlı) bir Falsy değeri döndüren bir program veya işlev yazın.

Tamsayıların giriş dizisi herhangi bir makul formatta olabilir. Giriş dizisinin en az iki tamsayı olduğunu varsayabilirsiniz. (İsterseniz giriş tamsayılarının farklı olduğunu varsayabilirsiniz, ancak muhtemelen yardımcı olmaz.) Pozitif ve negatif tamsayıları (ve 0) işleyebilmeniz gerekir.

Her zamanki skorlaması: bayt cinsinden en kısa cevap kazanır.

Örnek giriş

Aşağıdaki giriş dizilerinin her biri bir Doğruluk değeri vermelidir:

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

Aşağıdaki giriş dizilerinin her biri bir Falsy değeri vermelidir:

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

İpuçları

  • 3 veya daha az tam sayıdan oluşan herhangi bir dizinin otomatik olarak kabul edilebilir modulo 4 olduğuna dikkat edin. Daha genel olarak, m> k olduğunda otomatik olarak k uzunluklu bir dizi modulo m kabul edilebilir. Buna göre, kabul edilebilirlik testi gerçekten sadece sınırlı sayıda m kontrol edilmesini gerektirir.
  • Ayrıca, 2'nin 4'ü böldüğünü ve kabul edilebilir modulo 2 (yani, çift veya tek) herhangi bir dizinin otomatik olarak kabul edilebilir modulo 4 olduğuna dikkat edin. Daha genel olarak, m bölündüğünde ve bir dizi kabul edilebilir modulo m ise, otomatik olarak kabul edilebilir modulo Bu nedenle, kabul edilebilirliği kontrol etmek için, sadece isterseniz m'yi dikkate almak yeterlidir.
  • A1, a2, ..., ak kabul edilebilir bir diziyse, a1 + c, a2 + c, ..., ak + c de herhangi bir c (pozitif veya negatif) tamsayısı için kabul edilebilir.

Matematiksel uygunluk (isteğe bağlı okuma)

A1, a2, ..., ak bir tamsayı dizisi olsun. Diyelim ki n + a1, n + a2, ..., n + ak'nin tümü asal olacak şekilde sonsuz sayıda tamsayı vardır. O zaman a1, a2, ..., ak'nin kabul edilebilir olması gerektiğini göstermek kolaydır. Gerçekten, diyelim ki a1, a2, ..., ak kabul edilebilir değildir ve m, a1, a2, ..., ak kabul edilebilir modulo m olmayacak bir sayı olsun. O zaman neyi seçersek seçelim, n + a1, n + a2, ..., n + ak sayılarından biri m'nin katı olmalı, dolayısıyla asal olamaz.

Asal k-küpe varsayım hala sayı teorisi bir açık sorundur bu ifadeye, converse şudur: iddia olduğunu a1, a2, ..., ak kabul edilebilir bir dizi (veya eğer k-tuple sonra orada), n + a1, n + a2, ..., n + ak'nin tümü asal olacak şekilde sonsuz sayıda tam sayı olmalıdır. Örneğin, kabul edilebilir sekans 0, 2, n ve n + 2'nin her ikisi de asal olacak şekilde sonsuz sayıda tamsayı olması gerektiği ifadesini verir, bu ikiz prim varsayımdır (hala kanıtlanmamıştır).


3
[_60:0:60:120:180]bana gerçeği veriyor; Gerçekten öyle değil her en az bir sınıfa kesiştiği mgelen 2etmek 5dahil; buna ek olarak, her tek bir sınıf kestiği mgelen 2için 5dahildir.
Leaky Nun

1
@LeakyNun ile aynı [-60, 0, 60, 120, 180] için bu kabul edilebilir olmalıdır.
Karl Napf

-60 0 60 120 180 240 300her kalıntı sınıfı modülo 7 ile kesiştiği için kabul edilemez.
Greg Martin

Daha uzun test senaryolarımız olabilir mi?
Leaky Nun

@LeakyNun: Herhangi bir m için, m'den daha büyük ilk m primerleri kabul edilebilir bir sekans oluşturur. (İkinci-son Doğruluk test durumu buna m = 7 ile bir örnektir.) Yanlış test durumları, 1, ..., m tamsayılarıyla başlayarak, k ≤ m seçilerek ve k, 1, ..., m başlangıç ​​tamsayılarının herhangi birine veya tümüne.
Greg Martin

Yanıtlar:



7

Brachylog , 25 24 19 bayt

Karl Napf sayesinde 5 bayt.

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

Çevrimiçi deneyin!

Tüm test vakalarını doğrulayın!

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 bayt

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

Tüm test örnekleri ideone'de

Düzenleme: mantıksal ve bitsel olarak değiştirildi ve bir bayt kaydetmek için


2

JavaScript (ES6), 59 bayt

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

@ KarlNapf's kalanlar hile kullanır.


1
Peki, bu bir numara değil, sadece matematik ;-)
Karl Napf

2

Python, 67 64 bayt

İsimsiz lambda olarak:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • Edit1: değiştirilmiştir set()ile{}
  • Edit2: jeneratör etrafında köşeli parantez gerekmez all(...)
  • Edit3: Jonathan Allan tarafından işaret edildiği gibi, rangeyukarı gitmek gerekirlen(N)+1

İşlev olarak eski kod (96 bayt):

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
Burada size 5 baytlık tasarruf sağlayan yaklaşımınız için kredi veriyorum.
Leaky Nun

@LeakyNun Bir şey değil!
Karl Napf

2

Mathematica, 51 bayt

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

2

MATL , 11 bayt

"X@QGy\un>v

Gerçek, hepsini içeren bir dizidir (sütun vektörü). Falsy, en az bir sıfır içeren bir dizidir. Bu tanımları bu bağlantıyı kullanarak kontrol edebilirsiniz .

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın: doğruluk , sahtelik (biraz değiştirilmiş kod, her vaka netlik için yatay bir vektör üretir).

açıklama

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

Ben hala bu sitede odaklı alıyorum, bu yüzden bu çok sorulan bir soru türü özür dilerim, ama: doğruluk / falsy değerlerinin " en az bir sıfır ". Biri sonunda sabitlere ulaşmak için diziyi (bitwise AND kullanarak) işlememeli midir?
Greg Martin

@GregMartin Bu çok iyi bir soru. Cevabı hakkında oldukça sağlam bir fikir birliğine sahibiz; buraya
Luis Mendo

1
Anladım ve şimdi ilk bağlantınızın noktasını görüyorum. Açıklama için teşekkürler!
Greg Martin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.