Menguji urutan yang diizinkan

13

Ringkasan eksekutif: uji apakah urutan input bilangan bulat "dapat diterima", artinya tidak mencakup semua kelas residu untuk setiap modulus.

Apa itu urutan "diterima"?

Diberikan bilangan bulat m ≥ 2, kelas residu modulo m hanyalah m kemungkinan perkembangan aritmatika dari perbedaan umum m. Misalnya, ketika m = 4, 4 kelas residu modulo 4 adalah

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

Kelas residu kth terdiri dari semua bilangan bulat yang sisanya setelah dibagi dengan m sama dengan k. (selama seseorang mendefinisikan "sisa" dengan benar untuk bilangan bulat negatif)

Urutan bilangan bulat a1, a2, ..., ak dapat diterima modulo m jika gagal memotong setidaknya satu dari kelas residu. Misalnya, {0, 1, 2, 3} dan {-4, 5, 14, 23} tidak dapat diterima modulo 4, tetapi {0, 1, 2, 4} dan {0, 1, 5, 9} dan {0, 1, 2, -3} adalah modulo yang dapat diterima 4. Juga, {0, 1, 2, 3, 4} tidak dapat diterima modulo 4, sedangkan {0, 1, 2} adalah modulo yang dapat diterima 4.

Akhirnya, urutan bilangan bulat hanya dapat diterima jika dapat diterima modulo m untuk setiap bilangan bulat m ≥ 2.

Tantangan

Tulis program atau fungsi yang mengambil urutan bilangan bulat sebagai input, dan mengembalikan nilai (konsisten) yang benar jika urutan diterima dan nilai (konsisten) yang salah jika urutan tidak dapat diterima.

Urutan input bilangan bulat dapat dalam format apa pun yang masuk akal. Anda dapat mengasumsikan bahwa urutan input memiliki setidaknya dua bilangan bulat. (Anda juga dapat mengasumsikan bahwa bilangan bulat input berbeda jika Anda inginkan, meskipun mungkin tidak membantu.) Anda harus dapat menangani bilangan bulat positif dan negatif (dan 0).

Penilaian : jawaban terpendek, dalam byte, menang.

Input sampel

Urutan input berikut harus masing-masing memberikan nilai Kebenaran:

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

Urutan input berikut harus masing-masing memberikan nilai 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

Kiat

  • Perhatikan bahwa urutan 3 atau lebih sedikit bilangan bulat secara otomatis dapat diterima modulo 4. Lebih umum, urutan panjang k secara otomatis diterima modulo m ketika m> k. Oleh karena itu pengujian untuk penerimaan benar-benar hanya memerlukan pengecekan sejumlah terbatas m.
  • Perhatikan juga bahwa 2 membagi 4, dan bahwa setiap urutan yang dapat diterima modulo 2 (yaitu, semua genap atau semua ganjil) secara otomatis dapat diterima modulo 4. Lebih umum, jika m membagi n dan urutan dapat diterima modulo m, maka itu adalah modulo yang dapat diterima secara otomatis n. Untuk memeriksa penerimaan, oleh karena itu cukup untuk hanya mempertimbangkan prime m jika Anda inginkan.
  • Jika a1, a2, ..., ak adalah urutan yang dapat diterima, maka a1 + c, a2 + c, ..., ak + c juga dapat diterima untuk bilangan bulat c (positif atau negatif) apa pun.

Relevansi matematis (bacaan opsional)

Biarkan a1, a2, ..., ak menjadi urutan bilangan bulat. Misalkan ada banyak bilangan bulat n sehingga n + a1, n + a2, ..., n + ak semuanya prima. Maka mudah untuk menunjukkan bahwa a1, a2, ..., ak harus diterima. Memang, misalkan a1, a2, ..., ak tidak dapat diterima, dan biarkan m menjadi angka sehingga a1, a2, ..., ak tidak dapat diterima modulo m. Maka tidak peduli apa pun n yang kita pilih, salah satu angka n + a1, n + a2, ..., n + ak harus merupakan kelipatan m, karenanya tidak dapat menjadi prima.

The prime k-tupel dugaan adalah kebalikan dari pernyataan ini, yang masih merupakan masalah terbuka lebar di nomor teori: itu menegaskan bahwa jika a1, a2, ..., ak adalah urutan diterima (atau k-tuple ), maka ada harus bilangan bulat tak terhingga banyaknya sehingga n + a1, n + a2, ..., n + ak semuanya prima. Sebagai contoh, urutan yang diterima 0, 2 menghasilkan pernyataan bahwa harus ada banyak bilangan bulat n sehingga kedua n dan n + 2 adalah prima, ini adalah dugaan kembar bilangan prima (masih belum terbukti).

Greg Martin
sumber
3
[_60:0:60:120:180]memberi saya benar; memang itu tidak berpotongan setidaknya satu kelas di setiap mdari 2ke 5inklusif; selain itu, ia memotong hanya satu kelas di setiap mdari 2ke 5inklusif.
Leaky Nun
1
Saya memiliki hal yang sama untuk [-60, 0, 60, 120, 180] seperti @LeakyNun ini harus diterima.
Karl Napf
-60 0 60 120 180 240 300memotong setiap kelas residu modulo 7, sehingga tidak dapat diterima.
Greg Martin
Bisakah kita memiliki testcas yang lebih lama?
Leaky Nun
@ LeakyNun: Untuk m, m m pertama lebih besar dari m membentuk urutan yang dapat diterima. (Kasus uji Kebenaran kedua hingga terakhir adalah contohnya dengan m = 7.) Kasus uji palsu dapat dihasilkan dengan memulai dengan bilangan bulat 1, ..., m, memilih k ≤ m, dan menambahkan kelipatan acak dari k untuk salah satu atau semua bilangan bulat awal 1, ..., m.
Greg Martin

Jawaban:

4

Jelly, 10 byte

JḊðḶḟ%@ð€Ạ

Cobalah online! atau jalankan semua test case .

               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)?
Lynn
sumber
7

Brachylog , 25 24 19 byte

5 byte berkat Karl Napf.

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

Cobalah online!

Verifikasi semua testcases!

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.
Biarawati Bocor
sumber
4

Python, 61 60 byte

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

Semua uji kasus pada ideone

Sunting: diganti logis dan dengan bitwise & untuk menyimpan satu byte

Jonathan Allan
sumber
2

JavaScript (ES6), 59 byte

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

Menggunakan Trik Sisa sisa @ KarlNapf.

Neil
sumber
1
Yah, ini bukan tipuan, hanya matematika ;-)
Karl Napf
2

Python, 67 64 byte

Sebagai lambda yang tidak disebutkan namanya:

lambda N:all(len({i%m for i in N})<m for m in range(2,len(N)+1))
  • Sunting1: diganti set()dengan{}
  • Sunting2: tidak perlu tanda kurung siku di sekitar generator masuk all(...)
  • Edit3: Seperti yang ditunjukkan oleh Jonathan Allan, rangeharus naik kelen(N)+1

Kode lama sebagai fungsi (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
Karl Napf
sumber
1
Dengan ini saya memberi Anda kredit untuk pendekatan Anda yang menyelamatkan saya 5 byte.
Leaky Nun
@ LeakyNun Sama-sama!
Karl Napf
2

Mathematica, 51 byte

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

MATL , 11 byte

"X@QGy\un>v

Truthy adalah array (vektor kolom) yang berisi semua itu. Falsy adalah array yang mengandung setidaknya satu nol. Anda dapat memeriksa definisi ini menggunakan tautan ini .

Cobalah online! Atau memverifikasi semua kasus uji: truthy , falsy (kode sedikit diubah, setiap kasus menghasilkan vektor horisontal untuk kejelasan).

Penjelasan

"       % 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
sumber
Saya masih mendapatkan orientasi di situs ini, jadi minta maaf jika ini adalah jenis pertanyaan yang diajukan dengan baik, tetapi: Saya akan berpikir bahwa nilai kebenaran / kepalsuan harus berupa konstanta aktual, bukan pola seperti "array yang berisi paling tidak satu nol ". Tidakkah seharusnya seseorang memproses array (menggunakan bitwise AND dalam kasus ini) untuk sampai pada konstanta pada akhirnya?
Greg Martin
@GregMartin Itu pertanyaan yang sangat bagus. Kami memiliki konsensus yang cukup kuat tentang jawabannya; lihat di sini
Luis Mendo
1
Mengerti, dan sekarang saya melihat titik tautan pertama Anda. Terima kasih untuk penjelasannya!
Greg Martin