Nomor yang dapat dijangkau


14

Definisi

  • Fungsi Euler Phi ( fungsi totient AKA ): fungsi yang mengambil dalam jumlah positif dan mengembalikan jumlah angka positif kurang dari jumlah yang diberikan yang co-prime dengan nomor yang diberikan. Ini dilambangkan sebagai φ(n).

  • Nomor yang dapat dijangkau : jika ada bilangan bulat positif xsedemikian rupa φ(x) == n, maka ndapat dijangkau .

Tugas

Tulis fungsi / program untuk menentukan apakah bilangan bulat positif tertentu dapat dijangkau.

Memasukkan

Angka positif, dalam format apa pun yang masuk akal. Orang dapat berasumsi bahwa angka itu dalam kemampuan bahasa. Masukan unary diterima.

Keluaran

Dua nilai yang konsisten, satu untuk angka yang dapat dijangkau, dan yang lainnya untuk angka yang tidak terjangkau. Dua nilai itu bisa apa saja, asalkan konsisten.

Testcases

Angka yang dapat dijangkau di bawah 100adalah:

1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46, 48, 52, 54, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96

( A002202 tentang OEIS)

Aturan

Celah standar berlaku.

Kriteria menang

Ini adalah . Pengiriman dengan kemenangan byte-hitungan terendah.

Referensi



1
Saya menawarkan hadiah untuk jawaban Retina satu baris, di mana satu baris adalah regex polos (tanpa backticks).
Leaky Nun

@ LeakyNun Saya agak bingung, sejauh ini saya mengerti phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }.. apakah itu benar?
Khaled.K

@ Khaled.K ya, itu benar.
Leaky Nun

Jawaban:


6

Jelly , 7 6 byte

²RÆṪe@

Tidak terlalu cepat. Mengembalikan 1 atau 0 .

Cobalah online!

Bagaimana itu bekerja

²RÆṪe@  Main link. Argument: n

²       Square; yield n².
 R      Range; yield [1, ..., n²].
  ÆṪ    Compute the totient of each integer in the range.
    e@  Exists swap; test if n occurs in the generated array.

Bagaimana cara kerjanya?
Leaky Nun

1
Paksaan. Ada batas bawah untuk fungsi totient, jadi cukup untuk mengambil rentang yang cukup besar, memetakan total, dan memeriksa kemunculan input.
Dennis

Bisakah Anda membuktikan bahwa akar kuadrat adalah minimum?
Leaky Nun

Akar kuadrat sebenarnya bukan batas bawah, tetapi akar kuadrat dibagi dengan sqrt (2). Saya yakin bahwa menggandakan tidak diperlukan, tetapi bukti harus menunggu sampai saya tidur. Terlalu lelah sekarang.
Dennis

4
@ LeakyNun Sebenarnya, lemma 3 dari makalah ini membuktikan bahwa akar kuadrat adalah batas bawah kecuali n = 2k dengan aneh k . Karena k dan 2k memiliki jumlah yang sama, penggandaan tidak diperlukan.
Dennis

6

Mathematica, 28 byte

EulerPhi@Range[#^2]~FreeQ~#&

Seperti jawaban Jelly Dennis, kami menghitung nilai φ dari semua angka hingga kuadrat input dan melihat apakah input muncul di dalamnya. Kembali Falsejika input dapat dijangkau dan Truejika tidak. Ya, itu membingungkan. Tetapi FreeQsatu byte lebih pendek dari MatchQ, dan hei, spec mengatakan dua nilai yang konsisten> :)


2

JavaScript (ES6), 90 82 byte

Pengembalian 0atau true.

f=(n,x=n*2)=>x?(p=i=>(c=(a,b)=>a?c(b%a,a):b<2)(i,x)+(i&&p(--i)))(x)==n||f(n,x-1):0

Ini didasarkan pada asumsi bahwa jika x ada maka x ≤ 2n . Jika terbukti salah, ini harus diperbarui untuk digunakanx=n*n sebagai gantinya x=n*2(ukuran yang sama, jauh lebih lambat).

Kasing tepi adalah n = 128 yang mengharuskan untuk menghitung ϕ (255) .

Demo


Terletak strategis di bilangan prima Fermat semua berturut-turut pemberian menimbulkan kasus tepi berturut-turut n=2, n=8, n=128, n=32768dan n=2147483648.
Neil

1

Aksioma, 56 byte

f(x:PI):Boolean==member?(x,[eulerPhi(i)for i in 1..2*x])

saya tidak tahu apakah itu benar ... kode uji dan hasil

(35) -> [i  for i in 1..100|f(i)]
   (35)
   [1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46,
    48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96, 100]

Rentang 1 .. (2 * x) akan ok hingga input x = 500 ...



1

05AB1E , 5 byte

nLÕså

Penjelasan:

n       Square [implicit] input
 L      Range [1 .. a]
  Õ     Euler totient
   s    Put first input at the top of the stack
    å   Is it in the list?

Cobalah online!


0

05AB1E , 13 12 byte

EDIT : Menyimpan byte karena input digunakan kembali jika stack tidak memiliki cukup elemen.

Output 1 jika terjangkau, 0 jika tidak.

Bergantung pada asumsi bahwa x ≤ 2n jika ada.

xGNÕQi1,q}}0

Cobalah online!

Bagaimana itu bekerja

              # implicit input    
x            # push input, 2 * input
 G           # for N in 1..2*input
             # implicit push input
  N          # push N
   Õ         # push totient of N
    Q        # check if both are equal
     i.      # if equal
      1,     # print 1
        q    # quit program
         }   # end if
          }  # end for
           0 # push 0 if condition never reached
             # implicit print

0

C, 123 byte

g(a,b){return!a?b:g(b%a,a);}
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

Coba Online

#include <stdio.h>

// gcd function
g(a,b){return!a?b:g(b%a,a);}

// Euler phi(x) function
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}

// check if m is reachable, phi(x) for x in (m , m^2]
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

main()
{
    // print all reachable number below 50
    for(int x=1; x<50; x++)
    {
        s(x);

        if(t)
        {
            printf(" %d ~ phi(%d) \n", x, k);
        }
    }
}

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.