Coprimes hingga N


51

Diberi angka n >= 2, output semua bilangan bulat positif kurang dari ntempat gcd(n, k) == 1(dengan kmenjadi salah satu dari nomor output). Jumlah semacam ini saling memberontak satu sama lain.

Contoh: 10memberikan output [1, 3, 7, 9](dalam bentuk apa pun yang Anda suka, asalkan jumlahnya dipisahkan secara jelas dan dalam semacam daftar). Daftar tidak dapat memiliki entri duplikat dan tidak harus diurutkan.

Lebih banyak kasus uji:

2 -> [1]
3 -> [1, 2]
6 -> [1, 5]
10 -> [1, 3, 7, 9]
20 -> [1, 3, 7, 9, 11, 13, 17, 19]
25 -> [1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24]
30 -> [1, 7, 11, 13, 17, 19, 23, 29]

Kami juga tidak menghitung angka-angka di atas nyang sesuai n, hanya karena saya cukup yakin ada solusi tak terbatas.

Perhatikan juga: Angka-angka yang saling coprime juga dikatakan relatif prima atau sama-sama prima satu sama lain.


Apakah string terpisah (mis. 1\n3\n) Dihitung sebagai output yang valid?
devRicher

@devRicher yang berfungsi, tentu saja.
Rɪᴋᴇʀ

Intuisi tentang adanya jumlah angka yang tak terbatas di atas n yang merupakan koprime kepada n terasa benar bagi saya. Ada banyak bilangan prima yang tak terhingga, dan yang utama akan menjadi koprime dengan setiap angka di bawahnya. Oleh karena itu, setiap prime lebih besar dari n (yang jumlahnya sangat banyak) juga merupakan bagian dari daftar coprime.
Brian J

@BrianJ Bukan hanya itu. Jika c dan n adalah koprimes, c + kn dan n juga koprimes, untuk semua bilangan bulat k .
Dennis

1
Fakta menyenangkan: ini disebut total .
Wojowu

Jawaban:


17

Jelly , 3 byte

gÐṂ

Cobalah online!

Bagaimana cara kerjanya?

gÐṂ - (Monadic) Program lengkap.

g - Pembagi umum terbesar.
 ÐṂ - Jaga elemen dengan nilai tautan minimum (yaitu elemen dengan GCD == 1)
       Perhatikan bahwa ini secara otomatis membuat kisaran [1, input] (inklusif).

Bukti validitas

Karena kita ingin mengekstrak coprimes saja, nilai minimum dari daftar Greatest-Common-pembagi memiliki menjadi 1 untuk ÐṂtrik bekerja. Mari kita buktikan bahwa (dalam dua metode berbeda):

  1. Kisaran yang dihasilkan secara implisit, berisi dan . Pembagi umum terbesar adalah integer yang benar-benar positif, karenanya dijamin akan terjadi dan akan selalu menjadi nilai minimum.[1,input]1 1gcd(1,x)=1xZ1

  2. Dua bilangan bulat positif berturut-turut selalu merupakan koprime. Pertimbangkan , dengan . Kemudian kita mengambil bilangan bulat positif lain sehingga dan . y = x + 1 k k x k yx,yZy=x+1kkxky

    Ini menyiratkan bahwa , jadi , dengan demikian . Satu-satunya bilangan bulat positif untuk membagi adalah itu sendiri, sehingga dijamin akan muncul dalam daftar dan akan selalu menjadi nilai minimum.k ( x + 1 - x ) k 1 1 1k(yx)k(x+1x)k111


2
Anda mengalahkan Dennis dalam bahasanya sendiri setelah 9 bulan!
Adám

@ Adám saya tidak yakin apakah ÐṂada saat itu, toh saya cukup puas dengan yang ini.
Tn. Xcoder

2
Sebagai catatan, DṂmemang ada, tetapi hanya bekerja untuk monad. Komit dilaksanakan Þ, ÐṂ, ÐṀuntuk diad tanggal 9 Mei 2017.
Dennis

@ Dennis Saya tahu akan ada alasan bagus mengapa Anda tidak memiliki versi 3-byte. Kami juga bertanya-tanya tentang hal itu dalam obrolan, jadi terima kasih atas informasi yang bermanfaat!
Tn. Xcoder

56

Python 2 , 61 47 byte

lambda n:[k/n for k in range(n*n)if k/n*k%n==1]

Cobalah online!

Latar Belakang

Pertimbangkan cincin itu . Sementara cincin ini biasanya didefinisikan menggunakan modul residu modulo , ia juga dapat dianggap sebagai himpunan , di mana operator penjumlahan dan multiplikasi ditentukan oleh dan , di mana menunjukkan penambahan yang biasa, perkalian, dan operator modulo melalui bilangan bulat.n Z n(Zn,+n,n)na + n b = ( a + b )Zn={0,,n1}a n b = a ba+nb=(a+b)%n+ ,anb=ab%n+,, and %

Dua elemen dan dari disebut saling inversi multiplikatif modulo jika . Perhatikan bahwa setiap kali .aZ n n a n b = 1bZnn1anb=1%nn > 11%n=1n>1

Fix dan membiarkan menjadi coprime dari di . Jika untuk dua elemen dan dari , kita memiliki . Ini menyiratkan bahwa , dan kami mengikuti , yaitu, membagi secara merata. Karena tidak berbagi pembagi utama dengan , ini berarti bahwa . Akhirnya, karenaa n Z n a n x = a n y x y Z n a xn>1anZnanx=anyxyZna ( x - y )ax%n=ay%nn a ( x - y )a(xy)%n=ax%nay%n=0na(xy)a ( x - y ) n a n x - y - n < x - y < n x = y a n 0 , , a n ( n - 1 ) Z n Z n n 1 b Z n a n b = 1na(xy)nanxyn<xy<n , kami menyimpulkan bahwa . Ini menunjukkan bahwa produk adalah semua elemen berbeda . Karena memiliki tepat elemen, satu (dan tepat satu) dari produk tersebut harus sama dengan , yaitu, ada unik di sehingga .x=yan0,,an(n1)ZnZnn1 bZnanb=1

Sebaliknya memperbaiki dan membiarkan menjadi unsur yang tidak coprime untuk . Dalam hal ini, ada prime sehingga dan . Jika mengaku inverse modulo perkalian (sebut saja ), kita akan memiliki yang , yang berarti bahwa dan, karena itu, , jadi . Sejak , kita ikuti itua Z n n p p a p n a n b a n b = 1 a bn>1aZnnppapnanbanb=1( a b - 1 )ab%n=1n a b - 1 p a p a b p n p a b - 1 p ( a b ) - ( a b - 1 ) = 1 p(ab1)%n=ab%n1=0nab1papab . Di sisi lain, karena , kami juga mengikuti . Dengan cara ini, , yang bertentangan dengan asumsi bahwa adalah bilangan prima.pnpab1p(ab)(ab1)=1p

Ini membuktikan bahwa pernyataan berikut ini setara ketika .n>1

  • na dan adalah koprime.n

  • na menerima modul invers multiplikatif .n

  • na mengakui modul invers multiplikatif yang unik .n

Bagaimana itu bekerja

Untuk setiap pasangan bilangan bulat dan dalam , bilangan bulat adalah unik; pada kenyataannya, dan adalah hasil bagi dan sisa dari dibagi dengan , yaitu, mengingat , kita dapat memulihkan dan , di mana menunjukkan pembagian integer . Akhirnya, karena dan , adalah elemen ; sebenarnya, .b Z n k : = a n + b a b k n k a = k / n b = kabZnk:=an+babknka=k/n/ a n - 1 b n - 1 k Z n 2 k ( n - 1 ) n + ( n - 1 ) = n 2 - 1b=k%n/an1bn1kZn2k(n1)n+(n1)=n21

Seperti disebutkan di atas, jika dan adalah koprime, akan ada unik sehingga , yaitu, akan ada unik sehingga dan , sehingga daftar yang dihasilkan akan berisi tepat sekali.n b a banbk k / n = a k / n kab%n=1kk/n=aak/nk%n=(k/n)(k%n)%n=1a

Sebaliknya, jika dan yang tidak coprime, kondisi akan palsu untuk semua nilai sehingga , sehingga daftar yang dihasilkan akan tidak mengandung .n k / n kank a = k / n ak/nk%n=1ka=k/na

Ini membuktikan bahwa daftar yang dikembalikan lambda akan berisi semua coprimes di tepat sekali.Z nnZn


26
"GCD? Kemana kita pergi, kita tidak perlu GCD."
Rɪᴋᴇʀ

1
Wow. Itu saja yang ingin saya tulis, tetapi ternyata saya membutuhkan 15 karakter. Tetap saja woah. Kerja bagus.
Eric Lagergren

24

Jelly , 4 byte

gRỊT

Cobalah online!

Bagaimana itu bekerja

gRỊT  Main link. Argument: n

 R    Range; yield [1, ..., n].
g     Compute the GCD of n and each k in [1, ..., n].
  Ị   Insignificant; return 1 for GCDs less or equal to 1.
   T  Truth; yield the indices of all truthy elements.

33
Pengkodean dalam bahasa ini membutuhkan beberapagRỊT
Produk ETH

1
Saya berhasil (ab) menggunakan "Nilai tautan minimum" cepat ( ÐṂ) untuk mendapatkan 3 byte .
Tn. Xcoder

14

Mathematica, 25 byte

Range@#~GCD~#~Position~1&

Format output yang sedikit aneh, di mana setiap hasil dibungkus dalam daftar yang terpisah, misalnya {{1}, {3}, {7}, {9}}. Jika tidak, saya punya dua solusi dengan kecepatan 30 byte:

Select[Range[x=#],#~GCD~x<2&]&
#&@@@Range@#~GCD~#~Position~1&

Mathematica sebenarnya memiliki CoprimeQtetapi itu terlalu lama.


1
Apa Qartinya ini CoprimeQ?
Conor O'Brien

2
@ ConorO'Brien "pertanyaan" kurasa. Semua masalah keputusan built-in berakhir pada Q like EvenQ, PrimeQatau SubsetQ.
Martin Ender

10

2sable , 4 byte

Kode:

ƒN¿–

Penjelasan:

ƒ       # For N in the range [0, input]..
 N¿     #   Compute the GCD of N and the input
   –    #   If 1, print N with a newline

Menggunakan pengkodean CP-1252 . Cobalah online!


Kerja bagus (hampir) mengalahkan Dennis. (terlambat beberapa menit).
Zacharý

10

Python, 93 82 74 byte

f=lambda a,b:f(b,a%b)if b else a<2
lambda c:[i for i in range(c)if f(i,c)]

fsecara rekursif memeriksa koprimes, dan lambda kedua menghasilkannya. Menghasilkan daftar.


7

Sebenarnya , 8 byte

;╗R`╜┤`░

Cobalah online!

Penjelasan:

;╗R`╜┤`░
  R`  `░  elements of range(1, n+1) where
;╗  ╜     n and the element
     ┤    are coprime

1
Saya percaya Anda bisa melakukannya range(1, n)jika itu menghemat byte.
ETHproductions

1
@ ETHproductions Tidak. Dua opsi tersebut adalah R( range(1, n+1)) dan r( range(n)). Karena mereka setara, saya memilih R(karena saya tidak sengaja menekan caps lock saat menulis kode).
Mego

Ya, itulah yang saya pikirkan. Saya tidak melihat instruksi yang tampaknya didedikasikan untuk peningkatan, tetapi saya pikir mungkin ada satu saja
ETHproductions



6

JavaScript (ES6), 64 61 byte

Disimpan 3 byte berkat @ user81655

n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

Cuplikan tes

f=n=>[...Array(n).keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))

for(var i = 2; i < 50; i++) console.log(i + ":", `[${ f(i) }]`);


Tidak bisa Anda menukar a==dengan a<2?
Rɪᴋᴇʀ

@EasterlyIrk Tidak yakin, amungkin 0 pada titik tertentu. Saya harus memeriksa
ETHproductions

Anda dapat memindahkan fungsi GCD ke dalam filteruntuk menghapus kebutuhan untuk menerima bparameter:...keys()].filter(b=>(g=a=>b?g(b,b=a%b):a<2)(n))
user81655

@ user81655 Bagus sekali, terima kasih! :-)
ETHproduksi

6

Ubur-ubur , 19 18 byte

p
[#
`B
&~xr1
NnEi

Ini bekerja dengan menghitung faktorisasi utama dari setiap angka dalam rentang dan memeriksa apakah itu memotong input (Jellyfish belum memiliki builtin gcd). Untuk alasan bermain golf, hasilnya dalam urutan menurun. Cobalah online!

Penjelasan

Pertama, idievaluasi input; untuk input 10, nilai i-selnya adalah 10.

r1
i

Di sini r(rentang) diterapkan pada input dan 1. Karena input lebih besar dari 1, kisaran berada dalam urutan menurun; untuk input 10, ini memberi [9 8 7 6 5 4 3 2 1].

[#
`B
&~x
Nn

Bagian ini adalah satu fungsi besar, yang dievaluasi pada idan rentang di atas.

~x
n

Persimpangan ( n) dari faktor prima ( x).

&~x
Nn

Apakah ini kosong? ( N)

`
&~x
Nn

Utas ke level 0, uji untuk setiap elemen rentang.

[#
`B
&~x
Nn

Saring ( #) kisaran sehubungan dengan daftar boolean ini. Fungsi yang dihasilkan oleh [ingin menggunakan argumen #sebagai argumennya sendiri, jadi kami menempatkan a Buntuk memblokir #agar tidak mendapatkan argumen apa pun. Jika tidak, nilai ~-sel akan digunakan sebagai argumen fungsi besar. Akhirnya, pcetak hasilnya.


5

Ditumpuk, tidak bersaing, 24 21 byte

Disimpan 3 byte, terinspirasi oleh ruby Borsunho . ( 1 equntuk 2<)

{!n:>1+:n gcd 2<keep}

Coba di sini!

Ini adalah n-lambda yang mengambil argumen tunggal dan menghasilkan array.

{!n:>1+:n gcd 2<keep}
{!                  }  n-lambda
  n                    push n
   :>                  range [0, n)
     1+                range [1, n]
       :               duplicate
        n gcd          element-wise gcd with n
              2<       element-wise equality with 1
                       this yields the range [1, n] and a boolean mask of coprime numbers
                keep   then, we simply apply the mask to the range and keep coprimes.

Mengapa ini tidak bersaing?
Zacharý

@ ZakaryT terutama, keeptidak bekerja dengan baik.
Conor O'Brien

5

CJam , 14 byte

{:X{Xmff%:*},}

Cobalah online!

Penjelasan

Kami tidak perlu memeriksa semua kemungkinan pembagi adan buntuk menguji apakah mereka coprime. Cukuplah untuk melihat apakah ada faktor utama bpemisah a.

:X     e# Store the input in X.
{      e# Filter the list [0 1 ... X-1] by the results of this block...
  Xmf  e#   Get the prime factors of X.
  f%   e#   Take the current value modulo each of those prime factors.
  :*   e#   Multiply the results. Iff any of them divide the current
       e#   value, there's a 0 in the list, and the result of the product
       e#   is also 0, dropping the value from the resulting list.
},

5

Mathematica, 26 byte

Pick[r=Range@#,r~GCD~#,1]&

1
Ohhhh, aku sudah mencari sesuatu seperti Pick. Kurasa sekarang aku senang aku tidak menemukannya. ;) Tetapi itu harus sangat berguna untuk tantangan di masa depan.
Martin Ender


4

Brachylog , 16 13 byte

>.$p'(e:A*?),

Ini adalah fungsi yang mengambil N sebagai input, dan menghasilkan semua bilangan bulat kurang dari dan coprime untuk itu.

Cobalah online! Seperti yang sering terjadi di Brachylog, ini memiliki kode tambahan yang ditambahkan untuk membuat fungsi menjadi program penuh; Penerjemah Brachylog, jika diberi fungsi alih-alih program penuh, akan menjalankannya tetapi tidak mencetak hasilnya, yang berarti Anda tidak dapat benar-benar mengamati kerjanya.

Penjelasan:

Program Brachylog adalah rantai kendala; biasanya, LHS dari satu batasan adalah RHS dari yang berikutnya.

>.$p'(e:A*?),
>              The input is greater than
 .             the output, whose
  $p           prime factorisation does
    '(     )   not obey the following constraint:
      e        it has an element which
       :A*     can be multiplied by something to
          ?    produce the input.
            ,  (This comma turns off an unwanted implicit constraint.)

Memotong tiga karakter dengan menyadari tidak ada alasan untuk memeriksa untuk melihat apakah faktor umum (yang sudah diketahui sebagai faktor utama dari output) adalah faktor utama dari input. Kita sudah tahu itu prima, jadi kita bisa mengecek apakah itu faktor. Saya terkejut di sini yang :A*?tidak mengirim penerjemah ke loop tak terbatas dan tidak mengizinkan nilai non-integer untuk A , tetapi karena penerjemah melakukan apa yang saya inginkan, saya akan menerimanya.


4

Dyalog APL, 10 byte .

0~⍨⍳×1=⊢∨⍳

Penjelasan (input n):

0~⍨⍳×1=⊢∨⍳
         ⍳ - 1 ... n (Thus, ⎕IO is 1)
       ⊢∨  - Each GCD'd by n
     1=    - Test equality with 1 on each element
   ⍳×      - multiplied by its index
0~⍨        - without 0.

3
Saya suka cara kode APL terlihat seperti wajah yang Anda buat ketika Anda membacanya.
DJMcMayhem

Yap, dan itu menghancurkan hampir setiap bahasa yang tidak berorientasi kode golf. :)
Zacharý

Mengapa hanya "bisa" bekerja?
Rɪᴋᴇʀ

Saya hanya akan menganggap itu berhasil.
Zacharý

@ ZakaryT mengapa Anda tidak bisa mengujinya? Ketika saya tempel ke try-apl.org, itu kesalahan dengan token yang tidak valid.
Rɪᴋᴇʀ

4

Japt -f , 9 8 5 2 byte

jN

Cobalah

  • 2 byte disimpan berkat ETH yang menunjukkan brainfart, yang menyebabkan byte lain disimpan.

Anda bisa melakukannyao f_jU
Produk ETH

Terima kasih, @ETHproductions. Tidak tahu apa yang kupikirkan di sini! Pasti salah satu (banyak) momen ketika saya lupa jjuga dapat digunakan untuk menguji apakah 2 angka adalah co-prime.
Shaggy

3

Mathematica, 33 byte

xSelect[Range@x,x~CoprimeQ~#&]

Berisi U + F4A1


Apa yang tidak patut dilakukan?
Rɪᴋᴇʀ

3
@EasterlyIrk memperkenalkan fungsi yang tidak disebutkan namanya dengan argumen bernama. itu diterjemahkan sebagai panah di Mma.
Martin Ender

@ MartinEnder oh, keren.
Rɪᴋᴇʀ

U + F4A1 adalah karakter penggunaan pribadi. Seperti kata Martin, itu diterjemahkan sebagai panah di Mathematica.
Zacharý



3

meme , 11 byte, tidak bersaing , ketinggalan jaman

Non-bersaing karena iterasi STDIN adalah hal baru. Menggunakan pengkodean UTF-8.

d`}}]i=1?ip

Penjelasan:

d     Set program to not output result
`}    Loop next input-times
}]i   GCD of input and loop index
=1?   Is it equal to 1? If yes,
ip    Print out loop index

}mengakses item input berikutnya, tetapi input terakhir dilewati saat diberikan, sehingga memasukkan 6akan menghasilkan seperti 6 6 6 6 6 ...di STDIN, sehingga memungkinkan untuk membaca dua output dari satu.


Apakah Anda baru saja membuat bahasa ini hari ini? Jika itu dibuat sebelum tantangan, itu harus non-bersaing.
Rɪᴋᴇʀ

@EasterlyIrk Dibuat 3 hari yang lalu, saya hanya terus-menerus mengerjakannya. Juga, saya menganggap Anda maksud setelah ?
devRicher

Ya, salah ketik terima kasih. Dan tidak apa-apa, asalkan fitur yang digunakan dalam jawaban dan lebih tua dari tantangan.
Rɪᴋᴇʀ

@EasterlyIrk saya mengerti, dalam hal ini saya harus mengedit jawaban saya.
devRicher

Ya maaf : /
Rɪᴋᴇʀ


2

Ruby, 36 34

->n{n.times{|i|p i if i.gcd(n)<2}}

Memang, ini bukan jawaban yang sangat terilhami .

2 byte disimpan berkat Conor O'Brien.


Anda dapat memotong dua byte dengan menghapus tanda kurung di sekitar(n)
Conor O'Brien

2

Python 3 , 60 byte

Impor gcd alih-alih menulis lambda baru untuk itu. Saran golf diterima. Cobalah online!

import math
lambda c:[i for i in range(c)if math.gcd(c,i)<2]

Saya tidak berpikir Anda bisa bermain golf ini lagi. Mengimpor gcd secara langsung atau matematika karena keduanya menambah byte.
Rɪᴋᴇʀ

2

Julia, 30 byte

n->filter(x->(gcd(n,x)<2),1:n)

Fungsi anonim. filtermenghapus elemen dari daftar yang tidak benar berdasarkan suatu fungsi.

Dalam hal ini, fungsinya adalah x->(gcd(n,x)<2)(true jika gcd dari input dan elemen daftar kurang dari 2). Daftarnya adalah kisaran 1:n.


2

PARI / GP , 27 byte

n->[k|k<-[1..n],gcd(k,n)<2]

Ini menggunakan set-notasi yang diperkenalkan di versi 2.6.0 (2013). Dalam versi sebelumnya, diperlukan empat byte lagi:

n->select(k->gcd(k,n)<2,[1..n])

akan dibutuhkan.


Bagaimana cara kerjanya?
Rɪᴋᴇʀ

1
@EasterlyIrk Sama dengan sebagian besar kiriman ini - buat rentang dari 1 hingga n ( [1..n]), periksa apakah gcd adalah 1 ( gcd(n,k)<2), kembalikan angkanya dengan properti ini. The ->adalah notasi fungsi / penutupan, lebih pendek dengan 2 byte dari sintaks fungsi normal dan [...|...<-...,...]merupakan notasi set dijelaskan dalam jawaban (lihat bagian 2.3.14 di Pengguna Manual, atau mencari <-).
Charles

2

05AB1E , 4 byte

GN¿–

Cobalah online!

Bagaimana itu bekerja

     # implicit input
G    # for N in range(1..input)
 N   # push N
  ¿  # gcd(input, N)
   – # if 1, print N


1

Pyth , 5 byte

x1iLQ

Cobalah online!

Bagaimana itu bekerja

Perhatikan bahwa Pyth menggunakan pengindeksan 0.

x1iLQ   Q = eval(input())

x1iLQQ  implicit Q at the end
  iLQQ  [gcd(Q,0), gcd(Q,1), ..., gcd(Q,Q-1)]
x1      all occurences of 1 in the above list (return their indices)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.