Un número entero gaussiano es un número complejo cuyas partes reales e imaginarias son números enteros.
Los enteros gaussianos, como los enteros ordinarios, pueden representarse como un producto de números primos gaussianos, de una manera única. El desafío aquí es calcular los constituyentes primos de un entero gaussiano dado.
Entrada: un entero gaussiano, que no es igual a 0 y no es una unidad (es decir, 1, -1, i y -i no se pueden dar como entradas). Use cualquier formato sensible, por ejemplo:
- 4-5i
- -5 * j + 4
- (4, -5)
Salida: una lista de enteros gaussianos, que son primos (es decir, ninguno de ellos puede representarse como un producto de dos enteros gaussianos no unitarios), y cuyo producto es igual al número de entrada. Todos los números en la lista de salida deben ser no triviales, es decir, no 1, -1, i o -i. Se puede usar cualquier formato de salida sensible; no debe ser necesariamente el mismo que el formato de entrada.
Si la lista de salida tiene más de 1 elemento, entonces son posibles varias salidas correctas. Por ejemplo, para la entrada 9, la salida puede ser [3, 3] o [-3, -3] o [3i, -3i] o [-3i, 3i].
Casos de prueba (tomados de esta tabla ; 2 líneas por caso de prueba)
2
1+i, 1-i
3i
3i
256
1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i
7+9i
1+i,2−i,3+2i
27+15i
1+i,3,7−2i
6840+585i
-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
Las funciones integradas para factorizar enteros gaussianos no están permitidas. Sin embargo, se permite factorizar enteros comunes mediante funciones integradas.
fuente
3i
regresar como3,i
o3i
?3i
es la respuesta correcta porquei
no es primo. He actualizado el caso de prueba para hacerlo más claro.6840+585i
tiene la lista de factores equivocada, ya5
que no es una prima gaussiana. En cambio, vuelve-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
. Fuente256=(1+i)**16
no(1+i)**8
porque256=2**8=(2i)**8
y2i=(1+i)**2
Respuestas:
Jalea ,
6155 bytesPruébalo en línea! (Encabezado y pie de página formatea la salida)
-6 bytes gracias a @EricTheOutgolfer
Cómo funciona
fuente
Rubí ,
258256249246 + 8 =264257254 bytesUsa la
-rprime
bandera.Caray, que desastre.
Utiliza este algoritmo de stackoverflow.
Pruébalo en línea!
fuente
Python 2 ,
250239223215 bytesPruébalo en línea!
(a,b)
Algunas explicaciones descomponen recursivamente un complejo en dos complejos hasta que no sea posible la descomposición ...
fuente
def f(Z,s=[])
debería ahorrarte un personajeÓxido - 212 bytes
No estoy 100% seguro de si esto funciona 100% correcto, pero parece ser correcto para una amplia gama de pruebas. Esto no es más pequeño que Jelly, pero al menos es más pequeño que los idiomas interpretados (hasta ahora). También parece ser más rápido y puede funcionar a través de entradas de mil millones de magnitud en menos de un segundo. Por ejemplo, 1234567890 + 3141592650i factores como (-9487 + 7990i) (- 1 + -1i) (- 395 + 336i) (2 + -1i) (1 + 1i) (3 + 0i) (3 + 0i) (4+ 1i) (- 1 + 1i) (- 1 + 2i), (haga clic aquí para probar Wolfram Alpha)
Esto comenzó como la misma idea que la factorización ingenua de enteros, para pasar por cada número debajo del entero en cuestión, ver si se divide, repetir hasta que esté hecho. Luego, inspirado por otras respuestas, se transformó ... factoriza repetidamente elementos en un vector. Hace esto un buen número de veces, pero no 'hasta' nada. El número de iteraciones se ha elegido para cubrir una buena porción de entradas razonables.
Todavía usa "(a mod b) == 0" para probar si un número entero divide a otro (para los gaussianos, usamos el módulo gaussiano Rust incorporado, y consideramos que "0" es la norma == 0), sin embargo, la verificación de 'norma ( a / b)! = 1 'evita dividir "demasiado", básicamente permitiendo que el vector resultante se llene solo con números primos, pero sin llevar a la unidad ningún elemento del vector (0-i, 0 + i, -1 + 0i, 1 + 0i) (que está prohibido por la pregunta).
Los límites for-loop se encontraron a través del experimento. y va de 1 en adelante para evitar el pánico de división por cero, y x puede ir de -999 a 0 gracias a la duplicación de gaussianos sobre los cuadrantes (¿creo?). En cuanto a las limitaciones, la pregunta original no indicaba un rango válido de entrada / salida, por lo que se supone un "tamaño de entrada razonable" ... (Editar ... sin embargo, no estoy exactamente seguro de cómo calcular en qué número esto comienzan a "fallar", me imagino que hay enteros gaussianos que no son divisibles por nada por debajo de 999 pero que son sorprendentemente pequeños para mí)
Prueba la versión un tanto descuidada en play.rust-lang.org
fuente
Perl 6 ,
141bytesGracias a Jo King por -17 bytes
Pruébalo en línea!
fuente
floor
parte está verificando si$_/w
(es decir, el factor actual dividido por un número) es un número enteroPyth ,
5451454236 bytesPruébalo en línea!
Acepta la entrada en el formulario
1+2j
: los números puramente reales o imaginarios pueden omitir el otro componente (por ejemplo9
,2j
). La salida es una lista separada por una nueva línea de números complejos, en la forma(1+2j)
, con números puramente imaginarios que omiten la parte real.Esto utiliza la división de senderos simple, generando todos los enteros gaussianos con una magnitud mayor que 1 y menor que el valor actual, más el valor en sí. Estos se filtran para mantener aquellos que son un factor del valor, y el más pequeño por magnitud se elige como el siguiente factor primo. Esta es la salida, y el valor se divide por ella para producir el valor para la próxima iteración.
Además, Pyth vence a Jelly 😲 (aunque no espero que dure)
fuente