Tujuan Anda adalah untuk menentukan apakah angka yang diberikan n
prima dalam byte paling sedikit. Tapi, kode Anda harus berupa ekspresi Python 2 tunggal pada angka yang hanya terdiri dari
- operator
- variabel input
n
- konstanta bilangan bulat
- tanda kurung
Tidak ada loop, tidak ada tugas, tidak ada fungsi bawaan, hanya apa yang tercantum di atas. Iya itu mungkin.
Operator
Berikut daftar semua operator di Python 2 , yang termasuk operator aritmatika, bitwise, dan logis:
+ adddition
- minus or unary negation
* multiplication
** exponentiation, only with non-negative exponent
/ floor division
% modulo
<< bit shift left
>> bit shift right
& bitwise and
| bitwise or
^ bitwise xor
~ bitwise not
< less than
> greater than
<= less than or equals
>= greater than or equals
== equals
!= does not equal
Semua nilai menengah adalah bilangan bulat (atau Salah / Benar, yang secara implisit sama dengan 0 dan 1). Eksponen tidak boleh digunakan dengan eksponen negatif, karena ini dapat menghasilkan pelampung. Catatan yang /
melakukan pembagian lantai, tidak seperti Python 3, jadi //
tidak diperlukan.
Bahkan jika Anda tidak terbiasa dengan Python, operator harus cukup intuitif. Lihat tabel ini untuk diutamakan operator dan bagian ini dan di bawah untuk spesifikasi rinci tata bahasa. Anda dapat menjalankan Python 2 di TIO .
I / O
Input: Bilangan bulat positif n
minimal 2.
Output: 1 jika n
prima, dan 0 sebaliknya. True
dan False
bisa juga digunakan. Bytes paling sedikit menang.
Karena kode Anda adalah ekspresi, itu akan menjadi potongan, mengharapkan nilai input disimpan n
, dan mengevaluasi untuk output yang diinginkan.
Kode Anda harus bekerja untuk n
batas sewenang - wenang yang besar dan sistem. Karena tipe bilangan bulat Python tidak terikat, tidak ada batasan pada operator. Kode Anda mungkin membutuhkan waktu lama untuk dijalankan.
Jawaban:
43 byte
Cobalah online!
Metode ini mirip dengan jawaban kedua Dennis (dihapus), tetapi jawaban ini lebih mudah dibuktikan benar.
Bukti
Bentuk pendek
Digit paling signifikan2n n
(4**n+1)**n%4**n**2
dalam basis yang tidak dapat dibagi oleh n akan membuat digit (kurang signifikan) berikutnya dalam bukan nol (jika "digit berikutnya" tidak berada di bagian fraksional), maka a dengan bitmask dieksekusi untuk memeriksa jika ada digit pada posisi ganjil bukan nol.(4**n+1)**n%4**n**2/n
&
2**(2*n*n+n)/-~2**n
Bentuk panjang
Misalkan menjadi bilangan yang memiliki representasi basis b , yaitu a n b n + ⋯ + a 1 b 1 + a 0 b 0 , dan a i be the digit at " posisi " i dalam basis b representasi.[an,…,a1,a0]b b anbn+⋯+a1b1+a0b0 ai i b
Karena (dengann2n-1s) adalah bilangan bulat, dan⌊2n2n×4n2−11+2n=2n(2n−1)×(4n)n−14n−1=[2n−1,0,2n−1,0,2n−1,0]2n n 2n−1 ,
=[2n-1,0,2n-1,0,2n-1,0]2n.⌊2n1+2n⌋=0 [2n−1,0,2n−1,0,2n−1,0]2n
2**(2*n*n+n)/-~2**n
Selanjutnya, pertimbangkan
, sehinggaakan memotong angka menjadi 2 n digit terakhir - yang tidak termasuk ( n4n2=(2n)2n 2n (yaitu 1) tetapi termasuk semua koefisien binomial lainnya.(nn)
%4**n**2
Tentang
/n
:Jika adalah bilangan prima, hasilnya adalah [ ( nn . Semua digit pada posisi ganjil adalah nol.[(nn−1)/n,0,…,0,(n1)/n,0,0]2n
Jika bukan bilangan prima:n
Biarkan menjadi bilangan bulat terbesar sehingga n ∤ ( na (n>a>0). Tulis ulang dividen sebagain∤(na) n>a>0
Puncak pertama memiliki semua digit yang dapat dibagi dengan , dan digit pada posisi 2 a - 1 nol.n 2a−1
Sumand kedua memiliki digit paling signifikan (pada posisi ) tidak dapat dibagi dengan n dan (dasar) 2 n > n , sehingga hasil bagi ketika membagi bahwa dengan n akan memiliki digit pada posisi 2 a - 1 bukan nol.2a n 2n>n n 2a−1
Oleh karena itu, hasil akhir (2n 2a+1
(4**n+1)**n%4**n**2/n
) harus memiliki digit (basis , tentu saja) di posisi 2 a + 1 bukan nol.Akhirnya, bitwise AND (2n a&0=0,a&(2n−1)=a 0≤a<2n n n
&
) melakukan bitwise vectorized AND pada digit dalam basis (karena base adalah kekuatan 2), dan karena a & 0 = 0 , a & ( 2 n - 1 ) = a untuk semua 0 ≤ a < 2 n , adalah nol iff memiliki semua digit di posisi n pertama ganjil nol - yang setara dengan n menjadi prima.(4**n+1)**n%4**n**2/n&2**(2*n*n+n)/-~2**n
(4**n+1)**n%4**n**2/n
sumber
(4**n+1)**n%2**n**2/n&2**n**2/-~2**n<1
bekerjan
tidak menyebabkan interaksi yang tidak diinginkan antara basis digit4**n
.(4**n+1)**n%4**n**2/n<<n&4**n**2/-~2**n<1
. Saya ingin tahu apakah tantangan ini dimungkinkan tanpa operator bitwise.Python 2 , 56 byte
Cobalah online!
Ini adalah bukti-of-konsep yang tantangan ini bisa dilakukan dengan hanya operator aritmatika, khususnya tanpa bitwise
|
,&
atau^
. Kode ini menggunakan bitwise dan operator perbandingan hanya untuk bermain golf, dan mereka dapat dengan mudah diganti dengan persamaan aritmatika.Namun, solusinya sangat lambat, dan saya belum dapat menjalankan `, terima kasih kepada eksponen dua tingkat seperti 2 n n .n=6 2nn
Gagasan utamanya adalah membuat ekspresi untuk faktorial , yang memungkinkan kita melakukan tes primoral Teorema Wilson ( n - 1 ) ! % n > n - 2 di mana % adalah operator modulo.n! (n−1)!%n>n−2 %
Kita dapat membuat ekspresi untuk koefisien binomial , yang terbuat dari faktorial
Tetapi tidak jelas bagaimana cara mengekstrak hanya satu dari faktor-faktor ini. Caranya adalah dengan memalu dengan membuat m benar-benar besar.n! m
So, if we letc be the product (1−1m)(1−2m)⋯(1−n−1m) , we have
If we could just ignorec , we'd be done. The rest of this post is looking how large we need to make m to be able to do this.
For this, it suffices to have1−c<1/n! to avoid the ratio passing the next integer n!+1 .
Observe thatc is a product of n terms of which the smallest is (1−n−1m) . So, we have
which means1−c<n2m . Since we're looking to have 1−c<1/n! , it suffices to take m≥n!⋅n2 .
In the code, we usem=nn . Since Wilson's Theorem uses (n−1)! , we actually only need m≥(n−1)!⋅(n−1)2 . It's easy to see that m=nn satisfies the bound for the small values and quickly outgrows the right hand side asymptotically, say with Stirling's approximation.
sumber
This answer doesn't use any number-theoretic cleverness. It spams Python's bitwise operators to create a manual "for loop", checking all pairs1≤i,j<n to see whether i×j=n .
Python 2, way too many bytes (278 thanks to Jo King in the comments!)
Try it online!
This is a lot more bytes than the other answers, so I'm leaving it ungolfed for now. The code snippet below contains functions and variable assignment for clarity, but substitution turns isPrime(n) into a single Python expression.
Why does it work?
I'll do the same algorithm here in base 10 instead of binary. Look at this neat fraction:
If we put a large power of 10 in the numerator and use Python's floor division, this gives an enumeration of numbers. For example,1015/(9992)=1002003004 with floor division, enumerating the numbers 1,2,3,4 .
Let's say we multiply two numbers like this, with different spacings of zeroes. I'll place commas suggestively in the product.
The product enumerates, in three-digit sequences, the multiplication table up to 4 times 4. If we want to check whether the number 5 is prime, we just have to check whether005 appears anywhere in that product.
To do that, we XOR the above product by the number005005005…005 , and then subtract the number 001001001…001 . Call the result d . If 005 appeared in the multiplication table enumeration, it will cause the subtraction to carry over and put 999 in the corresponding place in d .
To test for this overflow, we compute an AND ofd and the number 900900900…900 . The result is zero if and only if 5 is prime.
sumber