Numeri raggiungibili


14

definizioni

  • Funzione Euler Phi ( funzione totient AKA ): una funzione che accetta un numero positivo e restituisce il numero di numeri positivi inferiore al numero dato che sono co-primi con un determinato numero. È indicato come φ(n).

  • Numero raggiungibile : se esiste un numero intero positivo xtale φ(x) == n, allora nè raggiungibile .

Compito

Scrivi una funzione / programma per determinare se un dato intero positivo è raggiungibile.

Ingresso

Un numero positivo, in qualsiasi formato ragionevole. Si può presumere che il numero rientri nelle capacità della lingua. L'input unario è accettato.

Produzione

Due valori coerenti, uno per i numeri raggiungibili e l'altro per i numeri non raggiungibili. I due valori possono essere qualsiasi cosa, purché siano coerenti.

Casi test

I seguenti numeri 100sono:

1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46, 48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96

( A002202 su OEIS)

Regole

Si applicano scappatoie standard .

Criterio vincente

Questo è . Vince con il conteggio di byte più basso.

Riferimenti



1
Offro una generosità a una risposta Retina di una riga, in cui l'unica riga è una regex semplice (senza backtick).
Leaky Nun,

@LeakyNun Sono un po 'confuso, finora ho capito che phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }.. è vero?
Khaled.K,

@ Khaled.K sì, è vero.
Leaky Nun,

Risposte:


6

Gelatina , 7 6 byte

²RÆṪe@

Non esattamente veloce. Restituisce 1 o 0 .

Provalo online!

Come funziona

²RÆṪe@  Main link. Argument: n

²       Square; yield n².
 R      Range; yield [1, ..., n²].
  ÆṪ    Compute the totient of each integer in the range.
    e@  Exists swap; test if n occurs in the generated array.

Come funziona?
Leaky Nun,

1
Forza bruta. C'è un limite inferiore per la funzione totient, quindi è sufficiente prendere un intervallo sufficientemente ampio, mappare il totient e verificare le occorrenze dell'input.
Dennis,

Puoi provare che la radice quadrata è il minimo?
Leaky Nun,

La radice quadrata non è in realtà un limite inferiore, ma lo è la radice quadrata divisa per sqrt (2). Sono sicuro che non è necessario il raddoppio, ma una prova dovrà aspettare fino a quando non avrò dormito. Troppo stanco adesso.
Dennis,

4
@LeakyNun In realtà, il lemma 3 di questo documento dimostra che la radice quadrata ha un limite inferiore a meno che n = 2k con k dispari . Poiché k e 2k hanno lo stesso totale, non è necessario il raddoppio.
Dennis,

6

Mathematica, 28 byte

EulerPhi@Range[#^2]~FreeQ~#&

Come la risposta di Jelly di Dennis, calcoliamo i valori φ di tutti i numeri fino al quadrato dell'input e vediamo se l'input appare in esso. Restituisce Falsese l'ingresso è raggiungibile e Truese non lo è. Sì, è confuso. Ma FreeQè un byte più corto di MatchQe, ehi, la specifica ha detto che due valori coerenti> :)


2

JavaScript (ES6), 90 82 byte

Restituisce 0o true.

f=(n,x=n*2)=>x?(p=i=>(c=(a,b)=>a?c(b%a,a):b<2)(i,x)+(i&&p(--i)))(x)==n||f(n,x-1):0

Questo si basa sul presupposto che se x esiste allora x ≤ 2n . Se dimostrato falso, questo dovrebbe essere aggiornato per utilizzare x=n*ninvece x=n*2(stessa dimensione, molto più lento).

Un caso limite è n = 128 che richiede il calcolo ϕ (255) .

dimostrazione


Convenientemente i primi Fermat sono tutti consecutivi dando origine a casi limite consecutivi n=2, n=8, n=128, n=32768e n=2147483648.
Neil,

1

Assioma, 56 byte

f(x:PI):Boolean==member?(x,[eulerPhi(i)for i in 1..2*x])

non so se sia giusto ... codice di prova e risultati

(35) -> [i  for i in 1..100|f(i)]
   (35)
   [1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46,
    48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96, 100]

L'intervallo 1 .. (2 * x) sarebbe ok fino a quando l'ingresso x = 500 ...



1

05AB1E , 5 byte

nLÕså

Spiegazione:

n       Square [implicit] input
 L      Range [1 .. a]
  Õ     Euler totient
   s    Put first input at the top of the stack
    å   Is it in the list?

Provalo online!


0

05AB1E , 13 12 byte

EDIT : salvato un byte perché l'input viene riutilizzato se lo stack non ha abbastanza elementi.

Emette 1 se raggiungibile, 0 se no.

Si basa sul presupposto che x ≤ 2n se esiste.

xGNÕQi1,q}}0

Provalo online!

Come funziona

              # implicit input    
x            # push input, 2 * input
 G           # for N in 1..2*input
             # implicit push input
  N          # push N
   Õ         # push totient of N
    Q        # check if both are equal
     i.      # if equal
      1,     # print 1
        q    # quit program
         }   # end if
          }  # end for
           0 # push 0 if condition never reached
             # implicit print

0

C, 123 byte

g(a,b){return!a?b:g(b%a,a);}
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

Prova online

#include <stdio.h>

// gcd function
g(a,b){return!a?b:g(b%a,a);}

// Euler phi(x) function
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}

// check if m is reachable, phi(x) for x in (m , m^2]
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

main()
{
    // print all reachable number below 50
    for(int x=1; x<50; x++)
    {
        s(x);

        if(t)
        {
            printf(" %d ~ phi(%d) \n", x, k);
        }
    }
}

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.