Encontre a raiz 10 do cubo adic de 3


24

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 = 1na 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 ndígitos da soma / produto dependem apenas dos últimos dígitos da soma n/ multiplicandos.


Dado n, você precisa imprimir os últimos ndígitos da raiz cúbica 10-adic de 3, ou seja, xsatisfatório x*x*x = 3.

Termina:

...878683312291648481630318492665160423850087895134587

Seu código deve terminar n=1000antes 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 é . A resposta mais curta em bytes vence.



11
Também precisamos imprimir zeros à esquerda? A maioria das respostas (incluindo minha resposta Java) está atualmente falhando para elas. ou seja, n=12saída em 87895134587vez de 087895134587. Pessoalmente eu gostaria de torná-lo opcional, uma vez que invalidaria quase todas as respostas ..
Kevin Cruijssen

@KevinCruijssen done
Leaky Nun

Respostas:


26

Python 2 , 33 bytes

lambda k:pow(3,10**k*2/3+1,10**k)

Experimente online!

A powfunção calcula eficientemente o expoente modular 3**(10**k*2/3+1)%10**k.

Somos solicitados a encontrar uma solução para r**3 = 3 (mod 10**k). Queremos encontrar um expoente epara o qual o mapa x -> x**eé inverso ao cubo do x -> x**3mod de trabalho 10**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 todos x. (Vamos assumir isso gcd(x,10) = 1.) Então, podemos recuperar rinvertendo o cubo para obter r = 3**e (mod 10**k).

Expandindo (r**3)**e = r (mod 10**k), obtemos

r**(3*e-1) = 1 (mod 10**k)

Estamos à procura de um expoente 3*e-1que garanta a multiplicação que muitas cópias nos dão 1.

O módulo de multiplicação 10**kforma um grupo para números invertíveis, ou seja, números com gcd(x,10) = 1. Pelo Teorema de Lagrange, x**c = 1onde cestá a contagem de elementos no grupo. Para o módulo de grupo N, essa contagem é o valor do totiente de Euler φ(N), o número de valores de 1para Nque são relativamente primos para N. Então nós temos r**φ(10**k) = 1 (mod 10**k). Portanto, basta 3*e-1ser um múltiplo de φ(10**k).

Computamos

φ(10**k) = φ(5**k) φ(2**k)= 4 * 5**(k-1) * 2**(k-1) = 4 * 10**(k-1)`

Então, queremos 3*e-1ser um múltiplo de4 * 10**(k-1)

3*e - 1 = r * 4 * 10**(k-1)
e = (4r * 10**(k-1) + 1)/3

Muitas opções são possíveis r, mas r=5dá a expressão curta

e = (2 * 10**k + 1)/3

com eum número inteiro. Um pouco golfe usando encurta chão divisão epara 10**k*2/3+1, e expressando r = 3**e (mod 10**k)dá o resultado desejado r.


11
Gostaria de ver uma explicação mais detalhada sobre como isso funciona, resposta muito agradável!
Kritixi Lithos

Deveria (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)?
precisa saber é o seguinte

@ H.PWiz Sim, obrigado, eu consertei. Não tenho certeza se ser inverso para 3 é uma coincidência. Certamente não é suficiente, pois substituir o 2 por outros valores não funciona.
Xnor

@ xnor Eu acho que é suficiente. Você deve ser capaz de substituir para substituir 2com qualquer númerox = 2 (mod 3)
H.PWiz

Como sempre, a matemática vence!
Olivier Grégoire

18

Python 2 (PyPy) , 55 50 bytes

-5 bytes graças a @HP Wiz !

n=p=1;exec"p*=10;n+=3*(3-n**3)%p;"*input();print n

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 é chamada f, então f(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).dnn

d 1 3 ≡ 3 (mod 10)
 d 1 ≡ 3 3 (mod 10)
    ≡ 27 (mod 10)
    ≡ 7 (mod 10)

Agora, suponha que sabemos o número até o kth dígito,x

              x 3 ≡ 3 (mod 10 k )
  (d k + 1 · 10 k + x) 3 ≡ 3 (mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 ) (expansão binomial.)
(Observe que os outros dois termos podem ser ignorados, pois são 0 mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )

Nós sabemos isso:

       x ≡ 7 (mod 10)
      x 2 ≡ 49 (mod 10)
         ≡ 9 (mod 10)
  x 2 · 10 k ≡ 9 · 10 k   (mod 10 k + 1 )
3 · x 2 · 10 k ≡ 27 · 10 k (mod 10 k + 1 )
         · 7,10 k   (mod 10 k + 1 )

Substituindo isso em:

3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )
  7 · d k + 1 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )
             d k + 1 ≡ (3 - x 3 ) ÷ (7,10 k ) (mod 10)
                 ≡ (3 - x 3 ) ÷ (7,10 k ) (mod 10)
           ∴ d k + 1 ≡ 3 · (3 - x 3 ) ÷ 10 k    (mod 10) (3 é o inverso de 7 mod 10)

Na verdade, é provável que esta solução seja ótima. (para a maioria dos idiomas em que a fórmula é menos detalhada que a força bruta) A explicação pode ser encontrada em algum lugar do bate-papo , embora bastante disperso.
User202729

Se você voltado para golf a solução "não-exec", este obras para 62 bytes como um programa completo em vez de uma função
Mr. Xcoder

Isso imprime apenas os últimos 11dígitos de n=12e n=13.
Emigna

4
× e x parecem realmente muito semelhantes em algumas fontes e tornam a matemática extremamente difícil de ler. Posso sugerir o uso de · (ponto central) em vez de ×? (E, obviamente, seria bom ter o MathJax ).
Peter Taylor



4

05AB1E , 17 13 bytes

7IGD3mN°÷7*θì

Porta 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:

7               # Start result-string `r` at '7'
IG              # Loop `N` in the range [1, input)
  D3m           #  `r` to the power 3
       ÷        #  Integer-divided with
     N°         #  10 to the power `N`
        7*      #  Multiplied by 7
          θì    #  Then take the last digit of this, and prepend it to the result `r`
                # Implicitly output result `r` after the loop

O HPWiz apostou na minha abordagem, e o desafio não exige mais zeros à esquerda, para que você possa jogar mais?
somente ASCII

@ Somente ASCII Talvez, mas não sei como. @Emigna já golfed T%N°*+a θìpara mim, e o líder 'correção' de zero era apenas um bônus agradável com esta abordagem.
Kevin Cruijssen

4

Java 8, 158 156 141 136 135 bytes

n->{var t=n.valueOf(3);var r=n.ONE;for(int i=0;i++<n.intValue();)r=r.add(t.subtract(r.pow(3)).multiply(t).mod(n.TEN.pow(i)));return r;}

Porta 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:

n->{                            // Method with BigInteger as both parameter and return-type
  var t=n.valueOf(3);           //  Temp BigInteger with value 3
  var r=n.ONE;                  //  Result-BigInteger, starting at 1
  for(int i=0;i++<n.intValue();)//  Loop `i` in the range [1, n]
    r=r.add(                    //   Add to the result-BigDecimal:
       t.subtract(r.pow(3))     //    `t` subtracted with `r` to the power 3
       .multiply(t)             //    Multiplied by 3
       .mod(n.TEN.pow(i)));     //    Modulo by 10 to the power `i`
  return r;}                    //  Return the result-BigInteger

Ah, você usou esse algoritmo também? Vou reverter a minha resposta e adicionar as alterações;)
Olivier Grégoire

java.math.BigInteger u=null,r=u.valueOf(7),t=r;?
911 Neil

@ Neil Claro .. obrigado. Eu tinha java.math.BigInteger t=null,r=u.valueOf(7);t=r;antes de adicionar o upara salvar alguns bytes.
Kevin Cruijssen


11
* modpow, não modpod: P
somente ASCII

4

Java (JDK 10) , 106 bytes

n->n.valueOf(3).modPow(n.valueOf(2).multiply(n=n.TEN.pow(n.intValue())).divide(n.valueOf(3)).add(n.ONE),n)

Experimente online!

Créditos


11
166 bytes , alterando o loop for(int l=0,d;++l<=n;e alterando BigInteger I=null;para o var I=new BigInteger("3");qual podemos reutilizar.
Kevin Cruijssen

11
Mais 1 byte para salvar, alterando o loop para for(int l=0,d;l++<n;).
Kevin Cruijssen




1

Pitão , 23 bytes

Obviamente, isso usa a abordagem apenas do ASCII.

K7em=+K*%*7/^K3J^TdTJtU

Experimente aqui!


11
@DigitalTrauma Oh> _ <Eu juro que não percebi sua resposta lol ... eu tive uma porta da solução da ASCII, então eu vi a xnor e a porta diretamente para o golfe: PI acho que vou reverter para a revisão inicial , Apesar.
Mr. Xcoder

1

Carvão , 26 22 bytes

≔⁷ηFN≧⁺﹪׳⁻³Xη³Xχ⊕ιηIη

Experimente 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.)

FN

Faça um loop sobre o número de dígitos necessários.

        η       Current result.
       X ³     Take the cube. 
     ⁻³         Subtract from 3.
   ׳           Multiply by 3.
            ⊕ι  Increment the loop index.
          Xχ    Get that power of 10.
  ﹪             Modulo
≧⁺            η Add to the result.

Agora usa a abordagem do @ HPWiz para economizar 4 bytes.

Iη

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:

FN⊞υ⊟Φχ¬﹪⁻XI⁺κ⭆⮌υμ³IηXχ⊕ι↓Iυ

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.


O HPWiz atualizou (leia-se: golfe) minha abordagem. Além disso, o stringmap não deve mais ser necessário, pois o Leaky Nun atualizou os requisitos. também o primeiro link também aponta para a versão de força bruta> _>
ASCII-only

@ Somente ASCII Obrigado, eu corrigi os links e portou a abordagem do HPWiz, mas eu precisava que o StringMap concatenasse kcom a lista invertida como um número base 10.
911 Neil

Hmm. Eu teria pensado que fazê-lo da maneira mais simples possível pode ter sido um golfista. Acho que não
apenas ASCII

@ Somente ASCII Para a versão anterior, usei, Base(Reverse(u), 10)mas a prefixação kcustaria 4 bytes, enquanto isso como uma string custa apenas 2 bytes, resultando em uma economia de 1 byte depois de levar Castem consideração.
Neil

1

J , 33 bytes

f=:3 :'((10x^y)|]+3*3-^&3)^:y 1x'

TIO

porta da resposta do @ ASCII-only, mas usando o módulo fixo 10 ^ n


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.