Eu gosto de pensar em um número 10-adic como um número que vai infinitamente para a esquerda, ou em um módulo inteiro uma potência muito grande de 10.
As coisas carregam infinitamente para a esquerda e desaparecem. Para entender o que quero dizer, observe que ...6667 * 3 = 1
na terra 10-adic, já que o "2" que leva à esquerda vai para o infinito.
Adição e multiplicação fazem sentido para números 10-adic, uma vez que os últimos n
dígitos da soma / produto dependem apenas dos últimos dígitos da soma n
/ multiplicandos.
Dado n
, você precisa imprimir os últimos n
dígitos da raiz cúbica 10-adic de 3, ou seja, x
satisfatório x*x*x = 3
.
Termina:
...878683312291648481630318492665160423850087895134587
Seu código deve terminar n=1000
antes do envio.
Digamos que, se o número que você precisa imprimir começa com zero, não é necessário imprimir os zeros iniciais, pois não é realmente o ponto de imprimir zeros extras.
Isso é código-golfe . A resposta mais curta em bytes vence.
fonte
n=12
saída em87895134587
vez de087895134587
. Pessoalmente eu gostaria de torná-lo opcional, uma vez que invalidaria quase todas as respostas ..Respostas:
Python 2 , 33 bytes
Experimente online!
A
pow
função calcula eficientemente o expoente modular3**(10**k*2/3+1)%10**k
.Somos solicitados a encontrar uma solução para
r**3 = 3 (mod 10**k)
. Queremos encontrar um expoentee
para o qual o mapax -> x**e
é inverso ao cubo dox -> x**3
mod de trabalho10**k
, assim como os expoentes de descriptografia e criptografia no RSA são cancelados para produzir o valor original. Isso significa isso(x**3)**e = x (mod 10**k)
para todosx
. (Vamos assumir issogcd(x,10) = 1
.) Então, podemos recuperarr
invertendo o cubo para obterr = 3**e (mod 10**k)
.Expandindo
(r**3)**e = r (mod 10**k)
, obtemosEstamos à procura de um expoente
3*e-1
que garanta a multiplicação que muitas cópias nos dão1
.O módulo de multiplicação
10**k
forma um grupo para números invertíveis, ou seja, números comgcd(x,10) = 1
. Pelo Teorema de Lagrange,x**c = 1
ondec
está a contagem de elementos no grupo. Para o módulo de grupoN
, essa contagem é o valor do totiente de Eulerφ(N)
, o número de valores de1
paraN
que são relativamente primos paraN
. Então nós temosr**φ(10**k) = 1 (mod 10**k)
. Portanto, basta3*e-1
ser um múltiplo deφ(10**k)
.Computamos
Então, queremos
3*e-1
ser um múltiplo de4 * 10**(k-1)
Muitas opções são possíveis
r
, masr=5
dá a expressão curtacom
e
um número inteiro. Um pouco golfe usando encurta chão divisãoe
para10**k*2/3+1
, e expressandor = 3**e (mod 10**k)
dá o resultado desejador
.fonte
(r**3)**e = x (mod 10**k)
ser(r**3)**e = r (mod 10**k)
? Também é apenas uma coincidência isso(2 * 10**k + 1)/3 = 1/3 (mod 10**k)
?2
com qualquer númerox = 2 (mod 3)
Python 2 (PyPy) ,
5550 bytes-5 bytes graças a @HP Wiz !
Experimente online!
Calcula dígito (sem força bruta) por dígito, para que seja mais rápido que a força bruta.
Versão sem exec
Explicação
(Obrigado @Leaky Nun e @ user202729 por descobrir isso)
Primeiro, observe que esse
n**3
é um módulo de involução 10 (ou seja, se a função é chamadaf
, entãof(f(n)) == n
). Isso pode ser confirmado usando uma pesquisa exaustiva.Podemos usar a indução matemática para encontrar o próximo dígito.
Let Ser o th dígito do número (da direita).
dn
n
Agora, suponha que sabemos o número até o
k
th dígito,x
Nós sabemos isso:
Substituindo isso em:
fonte
11
dígitos den=12
en=13
.Wolfram Language (Mathematica) , 21 bytes
Experimente online!
fonte
05AB1E ,
1713 bytesPorta da resposta Python 2 (PyPy) da @ ASCII-only .
-4 bytes E correção de bugs para saídas com zeros à esquerda , graças a @Emigna , substituindo
T%N°*+
porθì
.Experimente online.
Explicação:
fonte
T%N°*+
aθì
para mim, e o líder 'correção' de zero era apenas um bônus agradável com esta abordagem.Java 8,
158156141136135 bytesPorta da resposta Python 2 (PyPy) da @ ASCII-only .
-2 bytes graças a @Neil .
-20 bytes graças a @ ASCII-only .
NOTA: Já existe uma resposta Java muito mais curta do @ OlivierGrégoire usando uma abordagem algorítmica utilizando
modPow
.Experimente online.
Explicação:
fonte
java.math.BigInteger u=null,r=u.valueOf(7),t=r;
?java.math.BigInteger t=null,r=u.valueOf(7);t=r;
antes de adicionar ou
para salvar alguns bytes.Java (JDK 10) , 106 bytes
Experimente online!
Créditos
fonte
for(int l=0,d;++l<=n;
e alterandoBigInteger I=null;
para ovar I=new BigInteger("3");
qual podemos reutilizar.for(int l=0,d;l++<n;)
.dc , 15
Usa exponenciação modular, como a resposta do @ xnor .
Experimente online!
O TIO calcula a entrada = 1000 em 21s.
fonte
Pyth , 12
Experimente online!
Novamente, usando exponenciação modular, como a resposta do @ xnor .
fonte
Haskell , 37 bytes
1 byte economizado graças ao ASCII-only!
Experimente online!
Eu uso uma abordagem semelhante apenas ao ASCII, mas evito usar divisão
fonte
Pitão , 23 bytes
Obviamente, isso usa a abordagem apenas do ASCII.
Experimente aqui!
fonte
Carvão ,
2622 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Inicialize o resultado para 7. (Não precisa ser 7, mas 0 não funciona.)
Faça um loop sobre o número de dígitos necessários.
Agora usa a abordagem do @ HPWiz para economizar 4 bytes.
Imprima o resultado.
Aqui está uma versão de força bruta de 28 bytes que cria raízes cúbicas de valores arbitrários:
Experimente online! Link é a versão detalhada do código. A primeira entrada é o número de dígitos, a segunda é o valor para a raiz.
fonte
k
com a lista invertida como um número base 10.Base(Reverse(u), 10)
mas a prefixaçãok
custaria 4 bytes, enquanto isso como uma string custa apenas 2 bytes, resultando em uma economia de 1 byte depois de levarCast
em consideração.J , 33 bytes
TIO
porta da resposta do @ ASCII-only, mas usando o módulo fixo 10 ^ n
fonte
Geléia ,
231817 bytesExperimente online!
Eu sei
ƒ
que será útil.fonte