Latar Belakang
Euler totient
fungsi φ(n)
didefinisikan sebagai jumlah bilangan bulat kurang dari atau sama dengan n
yang relatif prima untuk n
, yaitu, jumlah nilai yang mungkin dari x
dalam 0 < x <= n
yang
gcd(n, x) == 1
. Kami sudah
sebuah
beberapa totient - terkait tantangan
sebelumnya, tapi tidak pernah satu yang hanya menghitung itu.
Pemetaan fungsi totient ke seluruh angka adalah OEIS A000010 .
Tantangan
Diberikan bilangan bulat n > 0
, hitung φ(n)
. Anda dapat mengambil input melalui argumen baris perintah, input standar, argumen fungsi, atau hal lain yang masuk akal. Anda dapat memberikan output melalui output standar, nilai pengembalian, atau hal lain yang masuk akal. Fungsi anonim dapat diterima. Anda dapat berasumsi bahwa input tidak akan meluap metode alami Anda menyimpan bilangan bulat, misalnya int
dalam C, tetapi Anda harus mendukung input hingga 255.
Jika bahasa Anda memiliki fungsi totient bawaan, Anda tidak boleh menggunakannya.
Contohnya
φ(1) => 1
φ(2) => 1
φ(3) => 2
φ(8) => 4
φ(9) => 6
φ(26) => 12
φ(44) => 20
φ(105) => 48
Jawaban terpendek dalam byte menang. Jika bahasa Anda menggunakan penyandian selain UTF-8, sebutkan itu dalam jawaban Anda.
sumber
EulerPhi
Jawaban:
Mathematica,
2722 byteFungsi tanpa nama yang mengambil dan mengembalikan integer.
Tidak banyak yang dijelaskan di sini, kecuali yang
@
notasi awalan untuk panggilan fungsi dan notasi~...~
(asosiatif-kiri), sehingga di atas sama dengan:sumber
MATL, 7 byte
Anda dapat TryItOnline . Ide paling sederhana, buatlah vektor 1 ke N, dan ambil gcd dari setiap elemen dengan N (
Zd
jangan gcd). Kemudian, cari elemen mana yang sama dengan 1, dan jumlah vektor untuk mendapatkan jawabannya.sumber
_Zp
untuk mereka yang bertanya-tanya.J, 9 byte
Ini didasarkan pada esai Jsoftware tentang fungsi totient.
Diberikan n = p 1 e 1 ∙ p 2 e 2 ∙∙∙ p k e k di mana p k adalah faktor utama dari n , fungsi total φ ( n ) = φ ( p 1 e 1 ) ∙ φ ( p 2 e 2 ) ∙∙∙ φ ( p k e k ) = ( p 1 - 1) p 1 e 1 - 1 ∙ ( p 2 - 1) p 2e 2 - 1 ∙∙∙ ( p k - 1) p k e k - 1 .
Pemakaian
Penjelasan
sumber
[:*/@({.(^-(^<:)){:)2&p:
membutuhkan 24 byte, bahkan menggunakan builtin untuk mendapatkan bilangan prima dan eksponen mereka. Atau mungkin ada jalan yang lebih pendek dan saya tidak melihatnya.Jelly, 4 byte
Cobalah online!
Penjelasan
Dengan built-in
Cobalah online!
Penjelasan
sumber
Haskell, 28 byte
Menggunakan pola konstanta yang cocok dengan Haskell . Trik di sini cukup standar untuk bermain golf, tetapi saya akan menjelaskan kepada khalayak umum.
Ekspresi
gcd n<$>[1..n]
memetakangcd n
ke[1..n]
. Dengan kata lain, itu menghitunggcd
dengann
setiap nomor dari1
ken
:Dari sini, output yang diinginkan adalah jumlah
1
entri, tetapi Haskell tidak memilikicount
fungsi. Cara idiomatisfilter
untuk mempertahankan hanya1
, dan mengambil hasilnyalength
, yang terlalu lama untuk bermain golf.Sebaliknya,
filter
disimulasikan oleh pemahaman daftar[1|1<-l]
dengan daftar yang dihasilkanl
. Biasanya, daftar pemahaman mengikat nilai ke variabel seperti di[x*x|x<-l]
, tetapi Haskell memungkinkan pola untuk dicocokkan, dalam hal ini konstanta1
.Jadi,
[1|1<-l]
menghasilkan1
pada setiap pertandingan1
, secara efektif mengekstraksi hanya1
dari daftar asli. Memanggilnyasum
memberikan panjangnya.sumber
Python 2, 44 byte
Kurang bermain golf:
Menggunakan formula yang Euler totients dari pembagi
n
memiliki jumlahn
:Nilai
ϕ(n)
kemudian dapat dihitung secara rekursif sebagain
minus jumlah di atas pembagi nontrivial. Secara efektif, ini melakukan inversi Möbius pada fungsi identitas. Saya menggunakan metode yang sama dalam golf untuk menghitung fungsi Möbius .Terima kasih kepada Dennis untuk menghemat 1 byte dengan case dasar yang lebih baik, menyebarkan nilai awal
+n
ke dalam+1
untuk setiapn
loop, dilakukan sebagai-~
.sumber
Pyke, 5 byte
Coba di sini!
sumber
J, 11 byte
Pemakaian
di mana
>>
STDIN dan<<
STDOUT.Penjelasan
sumber
Python> = 3.5,
766458 byteTerima kasih kepada LeakyNun untuk bermain golf dengan 12 (!) Byte.
Berkat Sp3000 untuk bermain golf 6 byte.
Saya suka bagaimana Python dibaca. Ini masuk akal, bahkan melalui golf.
sumber
lambda n:sum(gcd(n,x)<2for x in range(n))
gcd
ke modul matematika! Saya tidak tahu itu.Regex (ECMAScript), 131 byte
Setidaknya -12 byte berkat Deadcode (dalam obrolan)
Cobalah online!
Output adalah panjang pertandingan.
Regex ECMAScript membuatnya sangat sulit untuk menghitung apa pun. Setiap backref yang didefinisikan di luar loop akan konstan selama loop, setiap backref yang didefinisikan di dalam loop akan direset ketika looping. Dengan demikian, satu-satunya cara untuk membawa status melintasi loop berulang adalah menggunakan posisi kecocokan saat ini. Itu bilangan bulat tunggal, dan itu hanya bisa berkurang (well, posisinya meningkat, tetapi panjang ekornya berkurang, dan itulah yang bisa kita lakukan dengan matematika).
Mengingat pembatasan-pembatasan itu, menghitung angka-angka coprime tampaknya mustahil. Sebagai gantinya, kami menggunakan formula Euler untuk menghitung angka total.
Begini tampilannya di pseudocode:
Ada dua hal yang meragukan tentang ini.
Pertama, kita tidak menyimpan input, hanya produk saat ini, jadi bagaimana kita bisa sampai pada faktor utama input? Triknya adalah bahwa (N - (N / P)) memiliki faktor prima yang sama> P dengan N. Ini mungkin mendapatkan faktor prima baru <P, tetapi kita tetap mengabaikannya. Perhatikan bahwa ini hanya berfungsi karena kita beralih pada faktor utama dari yang terkecil hingga yang terbesar, sebaliknya akan gagal.
Kedua, kita harus mengingat dua angka di seluruh iterasi loop (P dan N, Z tidak dihitung karena konstan), dan saya hanya mengatakan itu tidak mungkin! Syukurlah, kita dapat memutar dua angka itu dalam satu. Perhatikan bahwa, pada awal loop, N akan selalu menjadi kelipatan Z, sedangkan P akan selalu kurang dari Z. Dengan demikian, kita bisa mengingat N + P, dan mengekstrak P dengan modulo.
Berikut kode semu yang sedikit lebih detail:
Dan inilah regex yang dikomentari:
Dan sebagai bonus ...
Regex (ECMAScript 2018, jumlah kecocokan), 23 byte
Cobalah online!
Output adalah jumlah kecocokan. ECMAScript 2018 memperkenalkan variabel-panjang melihat-belakang (dievaluasi dari kanan ke kiri), yang memungkinkan untuk hanya menghitung semua angka coprime dengan input.
Ternyata ini adalah metode independen yang sama yang digunakan oleh solusi Retina Leaky Nun , dan regex bahkan memiliki panjang yang sama ( dan dapat dipertukarkan ). Saya meninggalkannya di sini karena mungkin menarik bahwa metode ini berfungsi di ECMAScript 2018 (dan bukan hanya .NET).
sumber
Perl 6 ,
26 2422 bytePenjelasan:
Contoh:
sumber
Julia, 25 byte
Sederhana -
sum
fungsi ini memungkinkan Anda untuk memberikannya fungsi untuk diterapkan sebelum dijumlahkan - pada dasarnya setara dengan menjalankanmap
dan kemudiansum
. Ini secara langsung menghitung jumlah bilangan prima yang relatif kurangn
.sumber
Python 2, 57 byte
Uji di Ideone .
Latar Belakang
Dengan formula produk Euler ,
di mana φ menunjukkan fungsi total Euler dan p bervariasi hanya pada bilangan prima.
Untuk mengidentifikasi bilangan prima, kami menggunakan wajar teorema Wilson :
Bagaimana itu bekerja
Setiap saat, variabel m akan sama dengan kuadrat faktorial dari k - 1 . Bahkan, kami menamai argumen default ke k = 1 dan m = 0! 2 = 1 .
Selama k ≤ n ,
n*(k>n)
dievaluasi menjadi 0 dan kode berikutor
dijalankan.Ingat bahwa
m%k
akan menghasilkan 1 jika m adalah prima dan 0 jika tidak. Ini berarti bahwax%k<m%k
akan menghasilkan True jika dan hanya jika kedua k adalah bilangan prima dan x dapat dibagi oleh k .Dalam hal ini,
(n%k<m%k)*n/k
hasilkan n / k , dan kurangi dari n menggantikan nilai sebelumnya dengan n (1 - 1 / k) , seperti dalam formula produk Euler. Jika tidak,(n%k<m%k)*n/k
hasil 0 dan n tetap tidak berubah.Setelah menghitung di atas, kami menambah k dan mengalikan m dengan nilai "lama" dari k 2 , dengan demikian mempertahankan hubungan yang diinginkan antara k dan m , kemudian memanggil f secara rekursif dengan argumen yang diperbarui.
Setelah k melebihi n ,
n*(k>n)
evaluasi ke n , yang dikembalikan oleh fungsi.sumber
Ruby, 32 byte
sebuah lambda yang mengambil bilangan bulat n, dan mengembalikan jumlah berapa banyak bilangan bulat dalam rentang (1..n) yang coprime dengan n.
sumber
Brachylog , 25 byte
Penjelasan
Brachylog belum memiliki built-in GCD, jadi kami memeriksa bahwa kedua angka tersebut tidak memiliki faktor utama yang sama.
Predikat utama:
Predikat 1:
sumber
Pyth, 6 byte
Cobalah online!
Cobalah online!
Penjelasan
sumber
PowerShell v2 +, 72 byte
PowerShell tidak memiliki fungsi GCD yang tersedia, jadi saya harus memutar sendiri.
Ini membutuhkan input
$n
, kemudian berkisar dari1
ke$n
dan menyalurkannya ke dalam satu lingkaran|%{...}
. Setiap iterasi kami menetapkan dua variabel penolong$a
dan$b
kemudian mengeksekusi GCDwhile
lingkaran. Setiap iterasi yang kami periksa$b
masih non-nol, dan kemudian disimpan$a%$b
ke$b
dan nilai sebelumnya$b
untuk$a
untuk loop berikutnya. Kami kemudian mengakumulasikan apakah$a
sama dengan1
variabel output kami$o
. Setelah for loop selesai, kita menempatkan$o
pada pipeline dan output tersirat.Sebagai contoh cara kerja
while
loop, pertimbangkan$n=20
dan kita aktif$_=8
. Cek pertama sudah$b=20
, jadi kita masuk ke loop. Kami pertama-tama menghitung$a%$b
atau8%20 = 8
, yang ditetapkan$b
pada saat yang sama dengan yang20
ditetapkan$a
. Periksa8=0
, dan kami memasuki iterasi kedua. Kami kemudian menghitung20%8 = 4
dan mengaturnya$b
, kemudian mengatur$a
ke8
. Periksa4=0
, dan kami masukkan iterasi ketiga. Kami menghitung8%4 = 0
dan mengaturnya menjadi$b
, lalu mengatur$a
ke4
. Periksa0=0
dan kita keluar dari loop, jadi GCD (8,20) adalah$a = 4
. Jadi,!($a-1) = !(4-1) = !(3) = 0
jadi$o += 0
dan kami tidak menghitungnya.sumber
Faktor, 50 byte
Membuat rentang ( iota ) n , dan menyematkan n ke dalam fungsi yang mendapat gcd xn untuk semua nilai 0 <= x <= n , menguji jika hasilnya 1 . Saring rentang asli pada apakah hasil gcd xn adalah 1 , dan ambil panjangnya .
sumber
[ dup iota swap '[ _ gcd nip 1 = ] map sum ]
menghemat 6 byte (saya pikir - tidak terlalu berpengalaman dengan Factor).t/f
(simbol) di Factor, jadi satu-satunya cara untuk mengimplementasikannya adalah dengan[ dup iota swap '[ _ gcd nip 1 = 1 0 ? ] map sum ]
, yang sama persis panjangnya dengan solusi saat ini.TYPED:
dalam kode faktor nyata : PJapt
-mx
,75 byteJalankan secara online
-2 byte terima kasih kepada Shaggy
sumber
-mx
.-m
solusi tetapi lupa-x
. Terima kasih!Retina,
3629 byte7 byte berkat Martin Ender.
Cobalah online!
Penjelasan
Ada dua tahap (perintah).
Tahap pertama
Ini adalah penggantian regex sederhana, mengubah input menjadi banyak.
Misalnya,
5
akan dikonversi menjadi11111
.Tahap kedua
Regex ini mencoba mencocokkan posisi yang memenuhi kondisi (co-prime dengan input), dan kemudian mengembalikan jumlah kecocokan.
sumber
Gangguan Umum, 58 byte
Ini adalah loop sederhana yang menghitung hingga 1 sampai n yang diberikan dan menambah jumlah jika gcd = 1. Saya menggunakan nama fungsi o karena t adalah nilai boolean yang sebenarnya. Bukan yang terpendek tapi cukup sederhana.
sumber
MATLAB / Oktaf, 21 byte
Membuat fungsi anonim bernama
ans
yang dapat dipanggil dengan integern
sebagai satu-satunya input:ans(n)
Demo online
sumber
Python 2 , 44 byte
Ini menggunakan metode yang sama untuk mengidentifikasi coprime jawaban saya untuk “Coprimes hingga N” .
Cobalah online!
sumber
n-1
alih-alih1
, yang membuatnya bekerjan==1
.JavaScript (ES6), 53 byte
Cobalah online!
sumber
Sebenarnya, 11 byte
Cobalah online!
Penjelasan
Dengan built-in
Cobalah online!
sumber
;╗R`╜g1=`MΣ
untuk jumlah byte yang samaJavaScript (ES6), 67 byte
sumber
05AB1E, 7 byte
Dijelaskan
Cobalah online
sumber
L€¿1¢
;Lʒ¿}g
;L€¿ΘO
.APL, 7 byte
Ini adalah kereta fungsi monadik yang mengambil bilangan bulat di sebelah kanan. Pendekatan di sini adalah yang jelas: jumlah (
+/
) berapa kali GCD dari input dan angka dari 1 ke input (⊢∨⍳
) sama dengan 1 (1=
).Coba di sini
sumber
Haskell,
3130 byte1 byte disimpan, terima kasih kepada @Damien.
Pilih nilai dengan gcd = 1, petakan masing-masing ke 1, lalu ambil jumlah.
sumber
==1
dengan<2
Batch,
151145144 byteSunting: Disimpan 4 byte dengan menghapus spasi yang tidak perlu. Disimpan 1 byte dengan menggunakan
+=
. Disimpan 1 byte dengan mengosongkant
sebagaimana+=
akan menafsirkannya sebagai0
pula. Disimpan 1 byte berkat @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.sumber