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 = 1
en 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 n
dígitos de la suma / producto solo dependen de los últimos n
dígitos de los sumandos / multiplicandos.
Dado n
, debe imprimir los últimos n
dígitos de la raíz cúbica de 10 adic de 3, es decir, x
satisfactorio x*x*x = 3
.
Termina:
...878683312291648481630318492665160423850087895134587
Su código debe terminar n=1000
antes 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 código de golf . La respuesta más corta en bytes gana.
fuente
n=12
salida en87895134587
lugar de087895134587
. Personalmente, lo haría opcional, ya que invalidaría casi todas las respuestas ...Respuestas:
Python 2 , 33 bytes
Pruébalo en línea!
La
pow
función calcula eficientemente el exponente modular3**(10**k*2/3+1)%10**k
.Se nos pide encontrar una solución para
r**3 = 3 (mod 10**k)
. Queremos encontrar un exponentee
para el que el mapax -> x**e
sea inverso a lax -> x**3
modificación del funcionamiento en cubos10**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 todosx
. (Asumiremos a lo largo de esogcd(x,10) = 1
). Entonces, podemos recuperarr
invirtiendo el cubo para obtenerr = 3**e (mod 10**k)
.Expandiéndonos
(r**3)**e = r (mod 10**k)
, obtenemosEstamos buscando un exponente
3*e-1
que garantice la multiplicación que tantas copias nos da1
.El módulo de multiplicación
10**k
forma un grupo para números invertibles, es decir, aquellos congcd(x,10) = 1
. Por el teorema de Lagrange,x**c = 1
dondec
está la cuenta de elementos en el grupo. Para el módulo de grupoN
, ese recuento es el valor total de Eulerφ(N)
, el número de valores de1
aN
que son relativamente primosN
. Entonces, tenemosr**φ(10**k) = 1 (mod 10**k)
. Por lo tanto, es suficiente para3*e-1
ser un múltiplo deφ(10**k)
.Calculamos
Entonces, queremos
3*e-1
ser un múltiplo de4 * 10**(k-1)
Son posibles muchas opciones
r
, peror=5
da la breve expresióncon
e
un número entero Un poco de golf usando acorta suelo de divisióne
a10**k*2/3+1
, y expresandor = 3**e (mod 10**k)
da el resultado deseador
.fuente
(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)
?2
con cualquier númerox = 2 (mod 3)
Python 2 (PyPy) ,
5550 bytes-5 bytes gracias a @HP Wiz !
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**3
es un módulo de involución 10 (es decir, si se llama a la funciónf
, entoncesf(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).
dn
n
Ahora, supongamos que sabemos el número hasta el
k
dígito th,x
Lo sabemos:
Sustituyendo esto en:
fuente
11
dígitos paran=12
yn=13
.Wolfram Language (Mathematica) , 21 bytes
Pruébalo en línea!
fuente
05AB1E ,
1713 bytesPuerto 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:
fuente
T%N°*+
aθì
por mí, y el cero 'arreglo' que conduce era sólo una buena ventaja de este enfoque.Java 8,
158156141136135 bytesPuerto 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:
fuente
java.math.BigInteger u=null,r=u.valueOf(7),t=r;
?java.math.BigInteger t=null,r=u.valueOf(7);t=r;
inicialmente antes de agregar elu
de ahorrar algo de bytes.Java (JDK 10) , 106 bytes
Pruébalo en línea!
Créditos
fuente
for(int l=0,d;++l<=n;
y cambiandoBigInteger I=null;
avar I=new BigInteger("3");
lo que podemos reutilizar.for(int l=0,d;l++<n;)
.corriente continua , 15
Utiliza exponenciación modular, como la respuesta de @ xnor .
Pruébalo en línea!
TIO calcula input = 1000 en 21s.
fuente
Pyth , 12
Pruébalo en línea!
Nuevamente, usando exponenciación modular, como la respuesta de @ xnor .
fuente
Haskell , 37 bytes
¡1 byte guardado gracias a ASCII-only!
Pruébalo en línea!
Utilizo un enfoque similar al ASCII solo, pero evito usar la división
fuente
Pyth , 23 bytes
Por supuesto, esto utiliza el enfoque de ASCII solamente.
Pruébalo aquí!
fuente
Carbón ,
2622 bytesPrué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).
Pase el número de dígitos requeridos.
Ahora usa el enfoque de @ HPWiz para guardar 4 bytes.
Imprime el resultado.
Aquí hay una versión de fuerza bruta de 28 bytes que toma raíces cúbicas de valores arbitrarios:
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.
fuente
k
con la lista invertida como un número base 10.Base(Reverse(u), 10)
pero el prefijok
habrí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 tenerCast
en cuenta.J , 33 bytes
TIO
puerto de la respuesta de @ ASCII-only pero usando un módulo fijo 10 ^ n en todo
fuente
Gelatina ,
231817 bytesPruébalo en línea!
Sé
ƒ
que será útil.fuente