Numeri x tali che x ^ 2 divide 7 ^ x-1


16

Compito

C'è un insieme di numeri x, tale che x^2divide 7^x-1.

Il tuo compito è trovare questi numeri. Dato un input di n, il codice stamperà l'ennesimo numero che segue questa regola.

Esempi 1-indice

In   Out
3    3
9    24
31   1140

La sequenza pertinente può essere trovata qui .

Regole

La risposta più breve sarà il vincitore *

Si applicano le regole del golf standard

Non sono ammesse scappatoie

La risposta può essere 0 o 1 indicizzata, si prega di indicare nella risposta


@nimi Li ho scritti durante la pianificazione e non li ho mai implementati. Ho aggiornato la domanda
George

Quali sono i limiti di n? Posso dare il risultato corretto con n=9, ma n=10mi sta già causando problemi.
Briantist,

@briantist Se stai ottenendo il risultato sbagliato per valori di input più alti, la tua risposta è sbagliata. Se ci vuole solo molto tempo, ciò può dipendere dall'implementazione.
mbomb007,

Non ci vuole solo molto tempo. n=10mi dà 32; è perché inizia a usare double anziché interi e la mod è sbagliata dopo. :(
briantista,

Risposte:


8

Haskell, 34 byte

([x|x<-[1..],mod(7^x-1)(x^2)<1]!!)

Questo utilizza l'indicizzazione basata su 0. Esempio di utilizzo: ([x|x<-[1..],mod(7^x-1)(x^2)<1]!!) 30-> 1140.

È un'implementazione diretta della definizione. Costruisce un elenco di tutti i numeri xe seleziona il nth.


5

Pyth , 10 byte

e.f!%t^7Z*

Un programma che accetta l'input di un numero intero e stampa un valore a un indice.

Provalo online!

Come funziona

e.f!%t^7Z*     Program. Input: Q
e.f!%t^7Z*ZZQ  Implicit variable fill
               Implicitly print
e              the last
 .f         Q  of the first Q positive integers Z
     t^7Z      for which 7^Z - 1
    %          mod
         *ZZ   Z^2
   !           is zero

5

JavaScript (ES7), 40 byte

f=(n,i=1)=>n?f(n-!((7**++i-1)%i**2),i):i

Questo perde precisione abbastanza rapidamente a causa del fatto che JS perde precisione 7**19. Ecco una versione ES6 di precisione quasi arbitraria:

f=(n,i=0)=>n?f(n-!(~-(s=++i*i,g=j=>j?g(j-1)*7%s:1)(i)%s),i):i

Questo termina in circa un secondo per il test case 31.

Alcuni approcci più lunghi:

f=(n,i=0)=>n?f(n-!(~-(s=>g=j=>j?g(j-1)*7%s:1)(++i*i)(i)%s),i):i
f=(n,i=0)=>n?f(n-!(s=++i*i,g=(j,n=1)=>j?g(j-1,n*7%s):~-n%s)(i),i):i
f=(n,i=0)=>n?f(n-!(s=>g=(j,n=1)=>j?g(j-1,n*7%s):~-n%s)(++i*i)(i),i):i

4

05AB1E , 11 byte

µ7Nm<NnÖiN¼

Provalo online!

Per qualche motivo non riesco ½a lavorare µ7Nm<NnÖ½No sarei legato a Pyth.

µ           # Loop until the counter equals n.
 7Nm<       # Calc 7^x+1.
     Nn     # Calc x^2.
       Ö    # Check divisibility.
        iN¼ # If divisible, push current x and increment counter.
            # Implicit loop end.
            # Implicitly return top of stack (x)

.


Sì, ho avuto quella stranezza Önella mia lista di correzioni per mesi ma non riesco mai a gestirmi. Ad ogni modo, non è necessario il Ndato che µgenera automaticamente l'ultimo Nse lo stack è vuoto.
Emigna,

4

Python 2 , 48 46 byte

Grazie a @Dennis per -2 byte!

f=lambda n,i=1:n and-~f(n-(~-7**i%i**2<1),i+1)

Una funzione ricorsiva a un indice che accetta input tramite argomento e restituisce il risultato.

Provalo online! (Limite di ricorsione aumentato per consentire l'esecuzione del test case finale)

Come funziona

nè l'indice desiderato ed iè la variabile di conteggio.

L'espressione ~-7**i%i**2<1restituisce True(equivalente a 1) se i^2divide 7^i - 1e False(equivalente a 0) in caso contrario. Ogni volta che viene chiamata la funzione, il risultato dell'espressione viene sottratto n, diminuendo nogni volta che viene trovato un colpo; iviene anche incrementato.

Il comportamento in corto circuito di andsignifica che quando nè 0, 0viene restituito; questo è il caso base. Una volta raggiunto questo, la ricorsione si interrompe e il valore corrente di iviene restituito dalla chiamata di funzione originale. Piuttosto che usare esplicitamente i, questo viene fatto usando il fatto che per ogni chiamata di funzione, è stato eseguito un incremento usando il -~davanti alla chiamata; i 0 itempi di incremento danno i, come richiesto.


1
(~-7**i%i**2<1)salva un paio di byte.
Dennis,

@Dennis Certo! Grazie.
TheBikingViking

3

Python 2 , 57 53 51 byte

-4 byte grazie a ETHproductions
-2 byte grazie a TuukkaX

i=0
g=input()
while g:i+=1;g-=~-7**i%i**2<1
print i

Provalo online!
la sequenza è 1 indicizzata


@ETHproductions yep c:
Rod

Una testcase fallisce se si rimuovono le parentesi (7**i)? Li ho rimossi e ha funzionato per quelli che ho provato.
Yytsi,

@TuukkaX infatti, **ha una precedenza più alta di ~e-
Rod

2

Python 2, 57 byte

Ciò richiede molto, molto tempo per valori di grandi dimensioni. Utilizza anche molta memoria, perché crea l'intero elenco molto più lontano del necessario. Il risultato è indicizzato zero.

lambda n:[x for x in range(1,2**n+1)if(7**x-1)%x**2<1][n]

Provalo online


per curiosità, c'è qualche prova per il 2**n+1limite superiore?
Rod,

@Rod Non che io sappia, ma considerando che ci sono 50 valori <5000, sono sicuro che ce ne sono molti più di 50 < 2**50. Potrei usare 9**n+9, ma ci vuole molto più tempo. Ho iniziato a correre f(20)qualche tempo fa (con 2**n+1); non è ancora completato.
mbomb007,

Non penso nemmeno che ci sia una prova che la sequenza sia infinita, figuriamoci un bel limite superiore per l'ennesimo termine!
Greg Martin,

2

Mathematica, 43 byte

Al momento ho tre diverse soluzioni con questo numero di byte:

Nest[#+1//.x_/;!(x^2∣(7^x-1)):>x+1&,0,#]&
Nest[#+1//.x_/;Mod[7^x-1,x^2]>0:>x+1&,0,#]&
Nest[#+1//.x_:>x+Sign@Mod[7^x-1,x^2]&,0,#]&

Qual è il carattere tra x ^ 2 e (7 ^ x ... nella prima riga? Sembra una pipa ma più breve
Sefa

@Sefa È il carattere Unicode per il simbolo matematico "divide" e viene utilizzato da Mathematica come operatore per Divisible.
Martin Ender,

Eccone uno a 41 byte: Cases[Range[#^3],x_/;x^2∣(7^x-1)][[#]]&basato sull'argomento euristico secondo cui n ^ 3 è un limite superiore. Ho scoperto una prova davvero meravigliosa di questo, che questo margine è troppo stretto per contenere :)
Kelly Lowder

2

PARI / GP , 42 byte

Abbastanza diretto. 1 indicizzato, anche se questo potrebbe essere facilmente modificato.

n->=k=1;while(n--,while((7^k++-1)%k^2,));k

o

n->=k=1;for(i=2,n,while((7^k++-1)%k^2,));k


1

R, 35 byte

Questo funziona solo per n<=8.

z=1:20;which(!(7^z-1)%%z^2)[scan()]

Tuttavia, ecco una versione più lunga per cui funziona n<=25, per 50 byte :

z=1:1e6;which(gmp::as.bigz(7^z-1)%%z^2==0)[scan()]

Funziona solo 8perché diventa un int lungo?
George,

1
@george Sì, si perde la precisione come impostazione predefinita R a numeri interi a 32 bit. La seconda versione del codice utilizza un pacchetto gmp, che consente numeri interi arbitrariamente grandi. Tuttavia, esaurisco rapidamente la RAM per il calcolo di qualsiasi cosa sopra n=25.
rturnbull,

0

PHP, 47 49 byte

while($n<$argv[1])$n+=(7**++$x-1)%$x**2<1;echo$x;

Funziona solo per n <9 ( 7**9è maggiore di PHP_INT_MAXcon 64 bit)

62 byte usando numeri interi di lunghezza arbitraria: (non testato; PHP sulla mia macchina non ha bcmath)

for($x=$n=1;$n<$argv[1];)$n+=bcpowmod(7,++$x,$x**2)==1;echo$x;

Corri con php -nr '<code>' <n>.

pseudo codice

implicit: $x = 0, $n = 0
while $n < first command line argument
    increment $x
    if equation is satisfied
        increment $n
print $x

0

Pyke, 10 byte

~1IX7i^tR%

Provalo qui!

~1         -  infinite(1)
  IX7i^tR% - filter(^, not V)
    7i^    -    7**i
       t   -   ^-1
        R% -  ^ % v
   X       -   i**2
           - implicit: print nth value

0

Clojure , 83 byte

(fn[n](nth(filter #(= 0(rem(-(reduce *(repeat % 7N))1)(* % %)))(iterate inc 1N))n))

Provalo online!

Questo crea un elenco infinito di BigIntegers Java a partire da 1 e li filtra in base alla definizione. Esso utilizza indicizzazione in base zero per selezionare il n esimo valore dall'elenco filtrato.


0

Perl 5, 35 byte

Bene, questo mancava, quindi eccolo qui:

map{$_ if!((7**$_-1)%($_**2))}1..<>


0

Powershell, troppi byte

Solo per vedere se era possibile e lo è.

[System.Linq.Enumerable]::Range(1,10000)|?{[System.Numerics.BigInteger]::Remainder([System.Numerics.BigInteger]::Pow(7,$_)-1,$_*$_) -eq 0}

0

Perl 6 , 35 34 byte

{grep({(7**$_-1)%%$_²},^∞)[$_]}

0-indicizzati.

Rasato di un byte grazie a Brad Gilbert.


grep è una subroutine quindi puoi rimuovere lo spazio se metti le parentesi dopo di essa{grep(…)}
Brad Gilbert b2gills

0

QBIC , 39 byte

:{~(7^q-1)%(q^2)=0|b=b+1]~b=a|_Xq\q=q+1

Non riuscivo a farlo funzionare in QBasic 4.5, ma sembra funzionare bene in QB64. Per qualche motivo inspiegabile, QBasic rifiuta di dividere nettamente 13.841.287.200 per 144, ma fornisce invece un resto di -128. Quindi restituisce 16 come settimo termine di questa sequenza anziché 12 ...

:{      get N from the command line, start an infinite DO-loop
~       IF
(7^q-1) Part 1 of the formula (Note that 'q' is set to 1 as QBIC starts)
%       Modulus
(q^2)   The second part
=0      has no remainder
|b=b+1  Then, register a 'hit'
]       END IF
~b=a    If we have scored N hits
|_Xq    Quit, printing the last used number (q)
\q=q+1  Else, increase q by 1. 
        [DO-loop and last IF are implicitly closed by QBIC]

0

Meraviglia , 28 byte

@:^#0(!>@! % - ^7#0 1^#0 2)N

Zero indicizzati. Uso:

(@:^#0(!>@! % - ^7#0 1^#0 2)N)2

Filtra dall'elenco dei numeri naturali con un predicato che determina se x^2è divisibile per 7^x-1, quindi ottiene l'ennesimo elemento in quell'elenco.


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.