構築可能なnゴン


10

構成可能のn角形は、あなたが唯一のコンパスとマークされていない定規で構築できることを、n個の側面を持つ正多角形です。

N角形で構成可能であるのみNれる、ガウスにより述べたように別個のフェルマー素数の任意の数と2の累乗の積である(すなわち。n = 2^k * p1 * p2 * ...k整数、すべてされp、いくつかの別個のフェルマー素数)。

フェルマー素数は、正の整数でF(n)= 2 ^(2 ^ n)+1として表すことができる素数です。既知のフェルマー素数は、0、1、2、3、4のみです。

チャレンジ

整数n>2を指定して、nゴンが構成可能かどうかを指定します。

仕様

プログラムまたは関数は、整数またはその整数を表す文字列(単項、2進数、10進数、またはその他の基数)を受け取り、真または偽の値を返すか出力する必要があります。

これはコードゴルフなので、最も短い答えが勝ち、標準の抜け穴が適用されます。

関連するOEIS

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

回答:


8

ゼリー7 5 バイト

2バイトを節約してくれたSp3000に感謝します。

ÆṪBSỊ

次の分類を使用します。

これらは、phi(n)が2のべき乗である数値でもあります。

ここで、phiオイラーのトーテント関数です。

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

オンラインでお試しください!

または(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.

私のMathematica回答の直接ポートは2バイト長くなります:

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

ジェリーはわかりませんが、因数分解して2のべき乗を調べて、最大値が2かどうかを確認できますか?そして、それとその前身のビット単位が0の場合にも確認することができます
XNOR

@xnor Hm、いい考えですが、私の試みは同じ長さです。リストが3バイト未満で長さが1かどうかを確認する方法がある場合は、それよりも短くなります(指数のリストを提供する因数分解関数を使用することにより)。私はそれをする方法を見つけることができません。
マーティンエンダー2016

リストのすべての要素が等しいかどうかを確認するEがあることを確認します。数値を2倍にして因数分解し、すべての因数が等しいかどうかを確認するとどうなるでしょうか。
xnor

@xnorそれもいい考えです。:)それはおそらく6バイトですが、Sp3000はそこにありBそれを5でテストできると指摘しました
Martin Ender

あ、いいね。減分してから、バイナリ、製品のほうが短い可能性はありますか?
xnor

3

Mathematica、24バイト

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

OEISの次の分類を使用します。

cototient-of-totientがtotient-of-totientと等しくなるような数値として計算できます。

整数のtotient φ(x)は、と互いに素であるx以下の正の整数の数です。cototientは、正でない整数の数です。つまり、xxx-φ(x)。totientがcototientと等しい場合、それはのtotientを意味しφ(x) == x/2ます。

より簡単な分類

これらは、phi(n)が2のべき乗である数値でもあります。

結局1バイト長くなります:

IntegerQ@Log2@EulerPhi@#&

cototientsとtotientsとは何ですか?そして、cototient-of-totientsとtotient-of-totientsの比率はどうですか?
clismique 2016

@ Qwerp-Derpのtotientは、と互いに素であるn以下の整数の数であり、cototientは、と素でないそれ以下の整数の数です。リンクを編集します。nnn
マーティンエンダー2016

Mathematicaのビルトインが私を驚かせるために止まることはありません
Sefa

@ Qwerp-Derp 2番目の質問については、のトーティエントの(co)totientを計算することを意味しますn
マーティンエンダー2016

3

Retina、51 50バイト

0+$

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

入力はバイナリです。最初の2行は2の累乗で除算され、次の2行はすべての既知のフェルマー素数で除算されます(実際に数がフェルマー素数の積である場合)。編集:@Martin Ender♦のおかげで1バイト節約されました。


バイナリ入力、およびフェルマー素数に関する仮定
Sefa

2

JavaScript(ES7)、61バイト

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

1

実際には、6バイト

この回答は、Martin EnderのJelly answerのxnorのアルゴリズムに基づいています。ゴルフの提案を歓迎します。オンラインでお試しください!

▒D├♂≈π

使い方

         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.

0

バッチ、97バイト

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

入力は10進数の標準入力です。これは実際には、2の累乗を繰り返し計算するよりも1バイト短いです。@xnorの2のべき乗チェックを使用して1バイトを節約しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.