Encuentra la raíz cúbica de 10 adic de 3

24

Me gusta pensar en un número de 10 adic como un número que va infinitamente a la izquierda, o un módulo entero con una potencia muy grande de 10.

Las cosas se llevan infinitamente a la izquierda y se desvanecen. Para ver lo que quiero decir, tenga ...6667 * 3 = 1en cuenta que en la tierra de 10 adictos, ya que el "2" que lleva a la izquierda va al infinito.

La suma y la multiplicación tienen sentido para los números de 10 adic, ya que los últimos ndígitos de la suma / producto solo dependen de los últimos ndígitos de los sumandos / multiplicandos.


Dado n, debe imprimir los últimos ndígitos de la raíz cúbica de 10 adic de 3, es decir, xsatisfactorio x*x*x = 3.

Termina:

...878683312291648481630318492665160423850087895134587

Su código debe terminar n=1000antes del envío.

Digamos que si el número que necesita imprimir comienza con cero, entonces no necesita imprimir los ceros iniciales, ya que en realidad no es el punto para imprimir ceros adicionales.


Este es el . La respuesta más corta en bytes gana.

Monja permeable
fuente
OEIS A225404
Leaky Nun
1
¿Necesitamos imprimir también ceros a la izquierda? La mayoría de las respuestas (incluida mi respuesta de Java) actualmente fallan para esas. es decir, n=12salida en 87895134587lugar de 087895134587. Personalmente, lo haría opcional, ya que invalidaría casi todas las respuestas ...
Kevin Cruijssen
@KevinCruijssen hecho
Leaky Nun

Respuestas:

26

Python 2 , 33 bytes

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

Pruébalo en línea!

La powfunción calcula eficientemente el exponente modular 3**(10**k*2/3+1)%10**k.

Se nos pide encontrar una solución para r**3 = 3 (mod 10**k). Queremos encontrar un exponente epara el que el mapa x -> x**esea ​​inverso a la x -> x**3modificación del funcionamiento en cubos 10**k, al igual que los exponentes de descifrado y cifrado en RSA se cancelan para producir el valor original. Esto significa que (x**3)**e = x (mod 10**k)para todos x. (Asumiremos a lo largo de eso gcd(x,10) = 1). Entonces, podemos recuperar rinvirtiendo el cubo para obtener r = 3**e (mod 10**k).

Expandiéndonos (r**3)**e = r (mod 10**k), obtenemos

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

Estamos buscando un exponente 3*e-1que garantice la multiplicación que tantas copias nos da 1.

El módulo de multiplicación 10**kforma un grupo para números invertibles, es decir, aquellos con gcd(x,10) = 1. Por el teorema de Lagrange, x**c = 1donde cestá la cuenta de elementos en el grupo. Para el módulo de grupo N, ese recuento es el valor total de Euler φ(N), el número de valores de 1a Nque son relativamente primos N. Entonces, tenemos r**φ(10**k) = 1 (mod 10**k). Por lo tanto, es suficiente para 3*e-1ser un múltiplo de φ(10**k).

Calculamos

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

Entonces, queremos 3*e-1ser un múltiplo de4 * 10**(k-1)

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

Son posibles muchas opciones r, pero r=5da la breve expresión

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

con eun número entero Un poco de golf usando acorta suelo de división ea 10**k*2/3+1, y expresando r = 3**e (mod 10**k)da el resultado deseado r.

xnor
fuente
1
Me gustaría ver una explicación más detallada sobre cómo funciona, ¡muy buena respuesta!
Kritixi Lithos
Debe (r**3)**e = x (mod 10**k)ser (r**3)**e = r (mod 10**k)? ¿También es solo una coincidencia eso (2 * 10**k + 1)/3 = 1/3 (mod 10**k)?
H.PWiz
@ H.PWiz Sí, gracias, lo arreglé. No estoy seguro de si ser un inverso para 3 es una coincidencia. Ciertamente no es suficiente, ya que reemplazar el 2 con otros valores no funciona.
xnor
@xnor Creo que es suficiente. Debería poder reemplazar para reemplazar 2con cualquier númerox = 2 (mod 3)
H.PWiz
Como de costumbre, ¡las matemáticas ganan!
Olivier Grégoire
18

Python 2 (PyPy) , 55 50 bytes

-5 bytes gracias a @HP Wiz !

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

Pruébalo en línea!

Calcula (sin fuerza bruta) dígito por dígito, por lo que es más rápido que la fuerza bruta.

Versión sin ejecutivo

Explicación

(Gracias @Leaky Nun y @ user202729 por resolver esto)

Primero, observe que n**3es un módulo de involución 10 (es decir, si se llama a la función f, entonces f(f(n)) == n). Esto se puede confirmar mediante una búsqueda exhaustiva.

Podemos usar la inducción matemática para encontrar el siguiente dígito.
Deje ser el dígito th del número (desde la derecha).dnn

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

Ahora, supongamos que sabemos el número hasta el kdígito th,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 ) (Expansión binomial).
(Tenga en cuenta que los otros dos términos pueden ignorarse ya que son 0 mod 10 k + 1 )
3 · d k + 1 x 2 · 10 k + x 3 ≡ 3 (mod 10 k + 1 )

Lo sabemos:

       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 )

Sustituyendo esto en:

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 es el inverso de 7 mod 10)
Solo ASCII
fuente
En realidad, esta solución es probable que sea óptima. (para la mayoría de los idiomas donde la fórmula es menos detallada que el forzado bruto) La explicación se puede encontrar en algún lugar del chat , aunque bastante dispersa.
usuario202729
Si apuntó a la solución "no ejecutiva", esto funciona para 62 bytes como un programa completo en lugar de una función
Sr. Xcoder
Esto solo imprime los últimos 11dígitos para n=12y n=13.
Emigna
44
× yx se ven bastante similares en algunas fuentes y hacen que las matemáticas sean extremadamente difíciles de leer. ¿Puedo sugerir usar · (punto central) en lugar de ×? (Y, obviamente, sería bueno tener MathJax ).
Peter Taylor
1
guardar 5 bytes
H.PWiz
4

05AB1E , 17 13 bytes

7IGD3mN°÷7*θì

Puerto de la respuesta de Python 2 (PyPy) de @ ASCII-only .
-4 bytes Y corrección de errores para salidas con ceros iniciales gracias a @Emigna , reemplazando T%N°*+con θì.

Pruébalo en línea.

Explicación:

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
Kevin Cruijssen
fuente
HPWiz ha mejorado mi enfoque, y el desafío ya no requiere ceros a la izquierda para que pueda jugar más.
Solo ASCII
@ Solo ASCII Quizás, pero no estoy seguro de cómo. @Emigna ya ha jugado golf T%N°*+a θìpor mí, y el cero 'arreglo' que conduce era sólo una buena ventaja de este enfoque.
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;}

Puerto de la respuesta de Python 2 (PyPy) de @ ASCII-only .
-2 bytes gracias a @Neil .
-20 bytes gracias a @ ASCII-only .

NOTA: @ OlivierGrégoire ya cuenta con una respuesta Java mucho más corta que utiliza un enfoque algorítmico modPow.

Pruébalo en línea.

Explicación:

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
Kevin Cruijssen
fuente
Oh, ¿también usaste ese algoritmo? Revertiré mi respuesta y agregaré cambios;)
Olivier Grégoire
java.math.BigInteger u=null,r=u.valueOf(7),t=r;?
Neil
@Neil Por supuesto ... gracias. yo teníajava.math.BigInteger t=null,r=u.valueOf(7);t=r; inicialmente antes de agregar el ude ahorrar algo de bytes.
Kevin Cruijssen
1
141?
Solo ASCII
1
* modpow, no modpod: P
solo 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)

Pruébalo en línea!

Créditos

Olivier Grégoire
fuente
1
166 bytes cambiando el ciclo for(int l=0,d;++l<=n;y cambiando BigInteger I=null;a var I=new BigInteger("3");lo que podemos reutilizar.
Kevin Cruijssen
1
1 byte más para guardar cambiando el bucle a for(int l=0,d;l++<n;).
Kevin Cruijssen
2

Haskell , 37 bytes

¡1 byte guardado gracias a ASCII-only!

(10!1!!)
n!x=x:(n*10)!mod(9-3*x^3+x)n

Pruébalo en línea!

Utilizo un enfoque similar al ASCII solo, pero evito usar la división

H.PWiz
fuente
1
37?
Solo ASCII
1

Pyth , 23 bytes

Por supuesto, esto utiliza el enfoque de ASCII solamente.

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

Pruébalo aquí!

Sr. Xcoder
fuente
1
@DigitalTrauma Oh> _ <Juro que no he notado tu respuesta jajaja ... Primero tuve un puerto de la solución ASCII, luego vi la de xnor y la porté directamente al golf: PI supongo que volveré a la revisión inicial , aunque.
Sr. Xcoder
1

Carbón , 26 22 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

≔⁷η

Inicialice el resultado a 7. (No tiene que ser 7, pero 0 no funciona).

FN

Pase el número de dígitos requeridos.

        η       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.

Ahora usa el enfoque de @ HPWiz para guardar 4 bytes.

Iη

Imprime el resultado.

Aquí hay una versión de fuerza bruta de 28 bytes que toma raíces cúbicas de valores arbitrarios:

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

Pruébalo en línea! El enlace es a la versión detallada del código. La primera entrada es el número de dígitos, la segunda es el valor de la raíz.

Neil
fuente
HPWiz ha actualizado (léase: golfizado) mi enfoque. Además, stringmap ya no debería ser necesario ya que Leaky Nun ha actualizado los requisitos. también el primer enlace también apunta a la versión de fuerza bruta> _>
solo ASCII
@ Solo ASCII Gracias, arreglé los enlaces y porté el enfoque de HPWiz, pero necesitaba StringMap para concatenar kcon la lista invertida como un número base 10.
Neil
Hmm Pensé que solo hacerlo de la forma numérica simple podría haber sido más golfista. Sin embargo
solo ASCII
@ Solo ASCII Para la versión anterior que utilicé, Base(Reverse(u), 10)pero el prefijo khabría costado 4 bytes, mientras que hacerlo como una cadena solo cuesta 2 bytes, lo que resulta en un ahorro de 1 byte después de tener Casten cuenta.
Neil
1

J , 33 bytes

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

TIO

puerto de la respuesta de @ ASCII-only pero usando un módulo fijo 10 ^ n en todo

jayprich
fuente