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.