Ultime k cifre di Poteri di 2


16

Per qualsiasi numero intero r , esiste una potenza di 2 ciascuna delle cui ultime cifre r sono 1 o 2.

rX2xmod10r

Per , , poiché Per , , dal Nota: per , è (di nuovo)r=2x=929=512
r=3x=89289=618970019642690137449562112
r=4x=89

Input:r100

Uscita: x

Per esempio.

Ingresso: 2
Uscita: 9

Ingresso: 3
Uscita: 89

Il programma dovrebbe essere eseguito in un periodo di tempo ragionevole.

EDIT: la sequenza oeis per questa sfida è A147884 .


2
L'OEIS per questo compito è A147884
Quixotic

@Debanjan, sì vero. @ S. Marco, poteri di 2, non di 3
st0le

Ho un documento che descrive un algoritmo efficiente. lo posterò se qualcuno non riesce ad andare avanti con esso.
via

ah ok grazie!
TU

@ st0le: Complessità?
whacko__Cracko

Risposte:


4

Python, 166 caratteri

k,f,g=1,4,16
i=j=2
n=input()
m=10**n
a=lambda c:c('')-1-i or c('1')+c('2')-c('')+1
while i<=n:
 while a(str(j)[-i:].count):j,k=j*g%m,k+f
 i,g,f=i+1,g**5%m,f*5
print k

Ottimo lavoro, Mark :) Immagino tu l'abbia trovato :)
st0le

Puoi salvare alcuni byte usando il punto e virgola: 161 byte
movatica

2

Wolfram Language (Mathematica) , 78 76 57 55 byte

(x=0;While[Max@Abs[2IntegerDigits[2^++x,10,#]-3]>1];x)&

Provalo online!

IntegerDigits[a,10,r] genera un elenco di r ultime cifre decimali di a. Sottrai 3/2 e verifica che siano tutti -1/2 o +1/2.

Controllo del tempo: 20 secondi su TIO per r = 1 .. 10 .

Wolfram Language (Mathematica) , 102 95 91 89 byte

k/.FindInstance[Mod[n=0;Nest[#+10^n(2-Mod[#/2^n++,2])&,0,#]-2^k,5^#]==0,k,Integers][[1]]&

Provalo online!

Questa soluzione è molto più lunga ma molto più veloce. Seguendo il percorso suggerito in OEIS A147884 per passare tramite OEIS A053312 , oltre a utilizzare la FindInstancemagia, TIO riesce a calcolare r = 1 .. 12in meno di un minuto.


1

Rubino - 118 caratteri

k,f,g,m=1,4,16
i=j=2
m=10**(n=gets.to_i)
((k+=f;j=j*g%m)until j.to_s=~%r{[12]{#{i}}$};i+=1;f*=5;g=g**5%m)until n<i
p k

1

Haskell, 115 caratteri

import List
main=readLn>>=print. \r->head$findIndices(all(`elem`"12").take r.(++cycle"0").reverse.show)$iterate(*2)1


1

05AB1E , 18 15 byte

∞.Δo©‹®I.£2X:`P

Provalo online o verifica i primi 8 casi di test (altri timeout).

Spiegazione:

Usa il fatto che 2X>r per tutti i possibili risultati, per garantire che abbiamo cifre sufficienti per ottenere l'ultimo r cifre di 2X.

∞.Δ            # Find the first positive integer x which is truthy (==1) for:
   o           #  Take 2 to the power the integer: 2^x
    ©          #  Store it in variable `®` (without popping)
              #  Check that it's larger than the (implicit) input: r < 2^x
               #  (1 if truhy; 0 if falsey)
    ®          #  Push variable `®` again: 2^x
     I       #  Only leave the last input amount of digits
        2X:    #  Replace all 2s with 1s
           `   #  Push all digits separated to the stack
    P          #  Take the product of all digits on the stack (including the earlier check)
               #  (NOTE: Only 1 is truthy in 05AB1E)

0

CSharp - 111 caratteri

int a(int r){int x=1;a:x++;foreach(var c in Math.Pow(2,x)%Math.Pow(10,r)+"")if(c!='1'&&c!='2')goto a;return x;}


0

Julia 133 122 (51) byte

Ispirato dalla risposta di TE:

n->(k=1;f=4;g=big(16);i=j=2;m=10^n;while i<=n;while digits!(fill(0,i),j)⊈1:2;j,k=j*g%m,k+f;end;i,g,f=i+1,g^5%m,f*5end;k)

Provalo online!

Quanto segue è molto più breve, ma si arresta in modo anomalo per r> 8, come alcune delle altre risposte:

f(r,x=big(1))=digits!(fill(0,r),x)⊈1:2&&f(r,2x)+1

Provalo online!

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.