N-gons costruibili


10

Una n-gon costruibile è un poligono regolare con n lati che puoi costruire solo con una bussola e un righello non contrassegnato.

Come affermato da Gauss, l'unica n per la quale un n-gon è costruibile è un prodotto di un numero qualsiasi di primi Fermat distinti e una potenza di 2 (cioè n = 2^k * p1 * p2 * ...con kun numero intero e ogni pprimo distinto Fermat).

Un numero primo di Fermat è un numero primo che può essere espresso come F (n) = 2 ^ (2 ^ n) +1 con un numero intero positivo. Gli unici primi fermi conosciuti sono 0, 1, 2, 3 e 4.

La sfida

Dato un numero intero n>2, dì se n-gon è costruibile o meno.

specificazione

Il tuo programma o funzione dovrebbe prendere un numero intero o una stringa che rappresenta detto numero intero (in unario, binario, decimale o qualsiasi altra base) e restituire o stampare un valore di verità o falso.

Si tratta di code-golf, quindi vince la risposta più breve, si applicano scappatoie standard .

OEIS pertinente

Esempi

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

Risposte:


8

Gelatina , 7 5 byte

Grazie a Sp3000 per aver salvato 2 byte.

ÆṪBSỊ

Utilizza la seguente classificazione:

Questi sono anche i numeri per i quali phi (n) è una potenza di 2.

Dove phi è la funzione completa di Eulero .

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

Provalo online!

In alternativa (crediti a 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.

Una porta diretta della mia risposta Mathematica è più lunga di due byte:

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

Non conosco Jelly, ma potresti forse controllare la potenza di 2 considerando e verificando se il massimo è 2? Puoi anche verificare se il bit bit AND di esso e il suo predecessore sono 0.
xnor

@xnor Hm, buona idea ma i miei tentativi sono della stessa lunghezza. Se c'è un modo per verificare se un elenco è di lunghezza 1 in meno di 3 byte, sarebbe comunque più breve (usando la funzione di fattorizzazione che fornisce solo un elenco di esponenti). Non riesco a trovare un modo per farlo però.
Martin Ender,

Vedo che c'è E per verificare se tutti gli elementi di un elenco sono uguali. Cosa succede se si raddoppia il numero, lo si calcola e si verifica se tutti i fattori sono uguali?
xnor

@xnor Anche questa è una bella idea. :) Sarebbe probabilmente 6 byte allora, ma Sp3000 ha sottolineato che c'è Be che mi ha permesso di testarlo in 5.
Martin Ender

Ah, carino. Qualche possibilità che diminuisca, quindi binario, quindi il prodotto sia più corto?
xnor

3

Mathematica, 24 byte

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

Utilizza la seguente classificazione di OEIS:

Calcolabile come numeri in modo tale che cototient-of-totient sia uguale a totient-of-totient.

Il totient φ(x) di un intero xè il numero di interi positivi indicati xche sono primi conx . Il cototient è il numero di numeri interi positivi che non lo sono, vale a dire x-φ(x). Se il totient è uguale al cototient, significa che il totient di φ(x) == x/2.

La classificazione più semplice

Questi sono anche i numeri per i quali phi (n) è una potenza di 2.

finisce per essere un byte più lungo:

IntegerQ@Log2@EulerPhi@#&

Cosa sono cototienti e totienti? E sono i rapporti di cototient-of-totients e totient-of-totients?
clismique,

@ Qwerp-Derp Il totale di nè il numero di numeri interi sottostanti nche sono coprimi a n, e il cototient è il numero di numeri inferiori nche non lo sono. Modificherò in un link.
Martin Ender,

Il built-in di Mathematica non smetterà mai di stupirmi
Sefa,

@ Qwerp-Derp Per quanto riguarda la seconda domanda, significa solo che si calcola il (co) totient del totient di n.
Martin Ender,

3

Retina, 51 50 byte

0+$

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

L'input è in binario. Le prime due linee si dividono per una potenza di due, le successive due si dividono per tutti i primi Fermat noti (se in realtà il numero è un prodotto dei primi Fermat). Modifica: salvato 1 byte grazie a @Martin Ender ♦.


l'input binario va bene, così come l'assunto sui numeri primi di Fermat
Sefa,

2

JavaScript (ES7), 61 byte

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

1

In realtà, 6 byte

Questa risposta si basa sull'algoritmo di xnor nella risposta Jelly di Martin Ender . Suggerimenti di golf benvenuti. Provalo online!

▒D├♂≈π

Come funziona

         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

Lotto, 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)"

L'input è su stdin in decimale. Questo è in realtà 1 byte più corto del calcolo dei poteri di poteri di 2 iterativamente. Ho salvato 1 byte utilizzando il controllo di potenza di 2 xnor.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.