Konstruks n-gon

10

Sebuah constructible n-gon adalah poligon dengan n sisi yang Anda dapat membangun dengan hanya kompas dan penggaris bertanda.

Seperti yang dinyatakan oleh Gauss, satu-satunya n yang n-gon dapat dikonstruksikan adalah produk dari sejumlah bilangan prima Fermat yang berbeda dan kekuatan 2 (mis. n = 2^k * p1 * p2 * ...Dengan kmenjadi bilangan bulat dan setiap pbilangan prima Fermat yang berbeda).

Fermat prime adalah prime yang dapat dinyatakan sebagai F (n) = 2 ^ (2 ^ n) +1 dengan bilangan bulat positif. Satu-satunya Fermat prime yang diketahui adalah untuk 0, 1, 2, 3 dan 4.

Tantangan

Diberikan bilangan bulat n>2, katakan apakah n-gon dapat dikonstruksikan atau tidak.

Spesifikasi

Program atau fungsi Anda harus mengambil integer atau string yang mewakili integer tersebut (baik dalam unary, binary, desimal atau basis lainnya) dan mengembalikan atau mencetak nilai yang benar atau salah.

Ini adalah kode-golf, sehingga jawaban terpendek menang, celah standar berlaku.

OEIS yang relevan

Contohnya

3 -> True
9 -> False
17 -> True
1024 -> True
65537 -> True
67109888 -> True
67109889 -> False
Sefa
sumber

Jawaban:

8

Jelly , 7 5 byte

Terima kasih kepada Sp3000 untuk menghemat 2 byte.

ÆṪBSỊ

Gunakan klasifikasi berikut:

Ini juga angka yang phi (n) adalah kekuatan 2.

Di mana phi adalah fungsi total Euler .

ÆṪ        # Compute φ(n).
  B       # Convert to binary.
   S      # Sum bits.
    Ị     # Check whether it's less than or equal to 1. This can only be the
          # case if the binary representation was of the form [1 0 0 ... 0], i.e. 
          e# a power of 2.

Cobalah online!

Atau (kredit ke xnor):

ÆṪ’BP
ÆṪ        # Compute φ(n).
  ’       # Decrement.
   B      # Convert to binary.
    P     # Product. This is 1 iff all bits in the binary representation are
          # 1, which means that φ(n) is a power of 2.

Port langsung dari jawaban Mathematica saya adalah dua byte lebih lama:

ÆṪ        # Compute φ(n).
  µ       # Start a new monadic chain, to apply to φ(n).
   ÆṪ     # Compute φ(φ(n)).
      H   # Compute φ(n)/2.
     =    # Check for equality.
Martin Ender
sumber
Saya tidak tahu Jelly, tetapi bisakah Anda memeriksa kekuatan 2 dengan memfaktorkan dan memeriksa apakah maksimumnya 2? Anda juga dapat memeriksa apakah bitwise DAN dari itu dan pendahulunya adalah 0.
xnor
@ xnor Hm, ide bagus tapi usaha saya itu sama panjangnya. Jika ada cara untuk memeriksa apakah daftar memiliki panjang 1 dalam waktu kurang dari 3 byte, itu akan lebih pendek (dengan menggunakan fungsi factorisation yang hanya memberikan daftar eksponen). Saya tidak dapat menemukan cara untuk melakukan itu.
Martin Ender
Saya melihat ada E untuk memeriksa apakah semua elemen daftar sama. Bagaimana jika Anda menggandakan jumlahnya, faktor itu, dan periksa apakah semua faktor itu sama?
xnor
@ xnor Itu juga ide yang bagus. :) Itu mungkin akan menjadi 6 byte saat itu, tetapi Sp3000 menunjukkan bahwa ada Bdan yang akan saya coba dalam 5.
Martin Ender
Ah bagus. Adakah peluang penurunan itu, lalu biner, kemudian produk lebih pendek?
xnor
3

Mathematica, 24 byte

e=EulerPhi
e@e@#==e@#/2&

Menggunakan klasifikasi berikut dari OEIS:

Dapat dihitung sebagai angka-angka sedemikian sehingga cototient-of-totient sama dengan total-of-totient.

Jumlah total φ(x) dari bilangan bulat xadalah jumlah bilangan bulat positif di bawah ini xyang sesuai untuk x. Cototient adalah jumlah bilangan bulat positif yang tidak, yaitu x-φ(x). Jika jumlah sama dengan harga, itu berarti jumlah dari φ(x) == x/2.

Klasifikasi lebih mudah

Ini juga angka yang phi (n) adalah kekuatan 2.

berakhir dengan satu byte lebih lama:

IntegerQ@Log2@EulerPhi@#&
Martin Ender
sumber
Apa yang dimaksud dengan negosiasi dan negosiasi? Dan apakah rasio kewajaran dan rasio total kepatuhan?
clismique
@ Qwerp-Derp Total dari nadalah jumlah bilangan bulat di bawah ini nyang merupakan nkoprime, dan cototient adalah jumlah bilangan bulat di bawahnya nyang tidak. Saya akan mengedit tautan.
Martin Ender
Built-in Mathematica tidak akan pernah berhenti membuat saya takjub
Sefa
@ Qwerp-Derp Adapun pertanyaan kedua Anda hanya berarti bahwa Anda menghitung jumlah (co) dari jumlah total n.
Martin Ender
3

Retina, 51 50 byte

0+$

+`^(.*)(?=(.{16}|.{8}|....|..?)$)0*\1$
$1
^1$

Input dalam biner. Dua baris pertama dibagi dengan kekuatan dua, dua baris berikutnya oleh semua bilangan prima Fermat yang dikenal (jika faktanya nomor tersebut adalah produk dari bilangan Fermat). Sunting: Disimpan 1 byte berkat @Martin Ender ♦.

Neil
sumber
input biner baik-baik saja, serta asumsi tentang bilangan prima Fermat
Sefa
2

JavaScript (ES7), 61 byte

n=>[...Array(5)].map((_,i)=>n%(i=2**2**i+1)?0:n/=i)&&!(n&n-1)
Neil
sumber
1

Sebenarnya, 6 byte

Jawaban ini didasarkan pada algoritma xnor dalam jawaban Jelly Martin Ender . Saran bermain golf diterima. Cobalah online!

▒D├♂≈π

Bagaimana itu bekerja

         Implicit input n.
▒        totient(n)
 D       Decrement.
  ├      Convert to binary (as string).
   ♂≈    Convert each char into an int.
     π   Take the product of those binary digits.
         If the result is 1,
           then bin(totient(n) - 1) is a string of 1s, and totient(n) is power of two.
Sherlock9
sumber
0

Batch, 97 byte

@set/pn=
@for /l %%a in (4,-1,0)do @set/a"p=1<<(1<<%%a),n/=p*!(n%%-~p)+1"
@cmd/cset/a"!(n-1&n)"

Input pada stdin dalam desimal. Ini sebenarnya 1 byte lebih pendek dari menghitung kekuatan 2 iteratif. Saya menghemat 1 byte dengan menggunakan kekuatan @ xnor sebesar 2 cek.

Neil
sumber