İnşa edilebilir n-gons


10

Bir constructible n-gon yalnızca bir pusula ve işaretlenmemiş bir cetvel ile kurulabileceğini n tarafla da düzenli çokgendir.

Bir N-gen inşa edilebilir sadece n, n Gauss tarafından belirtildiği gibi farklı Fermat asal bir sayı ve 2'nin bir katı ürünü (yani. n = 2^k * p1 * p2 * ...İle kbir tamsayı ve her bir varlığı pbazı belirgin Fermat asal).

Fermat üssü, pozitif bir tamsayı ile F (n) = 2 ^ (2 ^ n) +1 olarak ifade edilebilecek bir asal sayıdır. Bilinen tek Fermat üssü 0, 1, 2, 3 ve 4 içindir.

Meydan okuma

Bir tamsayı verildiğinde n>2, n-gon'un yapılandırılabilir olup olmadığını söyleyin.

Şartname

Programınız veya işleviniz, bir tam sayı veya adı geçen tamsayıyı temsil eden bir dize (tekli, ikili, ondalık veya başka bir temelde) almalı ve doğruluk veya falsy değeri döndürmeli veya yazdırmalıdır.

Bu kod golf, bu yüzden en kısa cevap kazanır, standart boşluklar geçerlidir.

İlgili OEIS

Örnekler

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

Yanıtlar:


8

Jöle , 7 5 bayt

2 bayt tasarruf için Sp3000'e teşekkürler.

ÆṪBSỊ

Aşağıdaki sınıflandırmayı kullanır:

Bunlar aynı zamanda phi (n) 'nin 2 olduğu bir güçtür.

Nerede phi olan totient .

ÆṪ        # 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.

Çevrimiçi deneyin!

Alternatif olarak (xnor'a verilen krediler):

ÆṪ’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.

Mathematica yanıtımın doğrudan bağlantı noktası iki bayt daha uzun:

ÆṪ        # Compute φ(n).
  µ       # Start a new monadic chain, to apply to φ(n).
   ÆṪ     # Compute φ(φ(n)).
      H   # Compute φ(n)/2.
     =    # Check for equality.

Jelly'i bilmiyorum, ama maksimum 2 olup olmadığını çarpanlarına ayırarak ve belki de 2'nin gücünü kontrol edebilir misiniz? Ayrıca bitsel AND'in ve selefinin 0 olup olmadığını da kontrol edebilirsiniz.
xnor

@xnor Hm, iyi fikir ama benim bu denemelerim aynı uzunlukta. Bir listenin 3 bayttan daha kısa bir uzunlukta olup olmadığını kontrol etmenin bir yolu varsa, daha kısa olur (sadece üslerin bir listesini veren çarpanlara ayırma işlevini kullanarak). Yine de bunu yapmanın bir yolunu bulamıyorum.
Martin Ender

Bir listedeki tüm öğelerin eşit olup olmadığını kontrol etmek için E olduğunu görüyorum. Ya sayıyı iki katına çıkarır, çarpanlarına ayırır ve tüm faktörlerin eşit olup olmadığını kontrol ederseniz?
xnor

@xnor Bu da iyi bir fikir. :) Bu muhtemelen daha sonra 6 bayt olurdu ama SP3000 var olduğunu işaret Bve hangi bana 5 de test edelim
Martin Ender

Ah, güzel. Herhangi bir azalma sonra ikili, o zaman ürün daha kısa?
xnor

3

Mathematica, 24 bayt

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

OEIS'ten aşağıdaki sınıflandırmayı kullanır:

Totient-tototient totient totient'e eşit olacak şekilde sayılarla hesaplanabilir.

Totient φ(x) tamsayı xaşağıda pozitif tamsayılar sayısıdır xyani aralarında asal için vardır x. Kototient, yani pozitif olmayan tamsayıların sayısıdır x-φ(x). Eğer totient kototiente eşit ise, bu totient anlamına gelir φ(x) == x/2.

Daha basit sınıflandırma

Bunlar aynı zamanda phi (n) 'nin 2 olduğu bir güçtür.

daha uzun bir bayt olur:

IntegerQ@Log2@EulerPhi@#&

Kototientler ve totientler nelerdir? Ve birlikte-totientlerin ve totient-totient oranları?
clismique

Arasında Qwerp-Derp totient @ nAşağıda tamsayılar sayısı niçin göreceli asal olduğu nve cototient altında tamsayılar sayısıdır nbundan ibaret değildir. Bir bağlantıda düzenleyeceğim.
Martin Ender

Mathematica'nın yerleşik yapısı beni şaşırtmak için asla durmayacak
Sefa

@ Qwerp-Derp İkinci sorunuza gelince, sadece, turnuvanın (ortak) totientini hesapladığınız anlamına gelir n.
Martin Ender

3

Retina, 51 50 bayt

0+$

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

Giriş ikili. İlk iki çizgi ikiye bölünür, sonraki iki bilinen tüm Fermat primlerine bölünür (eğer aslında sayı Fermat primlerinin bir ürünü ise). Düzenleme: @Martin Ender ♦ sayesinde 1 bayt tasarruf edildi.


ikili girişin yanı sıra Fermat primleri
Sefa

2

JavaScript (ES7), 61 bayt

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


0

Toplu, 97 bayt

@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)"

Girdi ondalık olarak stdin üzerindedir. Bu aslında 2'nin güçlerini yinelemeli olarak hesaplamaktan 1 byte daha kısadır. @ Xnor'ın 2 kontrol gücünü kullanarak 1 bayt kazandım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.