1 @c English version 2013-07-30
3 * Funciones y variables para teoría de números::
6 @node Funciones y variables para teoría de números, , Teoría de Números, Teoría de Números
7 @section Funciones y variables para teoría de números
10 @deffn {Función} bern (@var{n})
11 Devuelve el @var{n}-ésimo número de Bernoulli del entero @var{n}.
12 @c WELL, ACTUALLY bern SIMPLIFIES, LIKE FACTORIAL -- DO WE WANT TO GET INTO THAT ???
13 @c OR JUST PRETEND IT'S "RETURNED" ???
14 Los números de Bernoulli iguales a cero son suprimidos si @code{zerobern} vale @code{false}.
16 Véase también @code{burn}.
20 (%i2) map (bern, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
22 (%o2) [1, - -, -, 0, - --, 0, --, 0, - --]
24 (%i3) zerobern: false$
25 (%i4) map (bern, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
27 (%o4) [1, - -, -, - --, --, - --, --, - ----, -]
28 2 6 30 42 30 66 2730 6
35 @deffn {Función} bernpoly (@var{x}, @var{n})
36 Devuelve el @var{n}-ésimo polinomio de Bernoulli de variable @var{x}.
40 @deffn {Función} bfzeta (@var{s}, @var{n})
41 Devuelve la función zeta de Riemann para el argumento @var{s}. El valor que devuelve es del tipo "big float" (bfloat) y
42 @var{n} es su número de dígitos.
44 Es necesario cargar en memoria esta función haciendo @code{load ("bffac")}.
48 @deffn {Función} bfhzeta (@var{s}, @var{h}, @var{n})
49 Devuelve la función zeta de Hurwitz para los argumentos @var{s} y @var{h}. El valor que devuelve es del tipo "big float" (bfloat) y @var{n} es su número de dígitos.
51 La función zeta de Hurwitz se define como
54 $$\zeta \left(s,h\right) = \sum_{k=0}^\infty {1 \over \left(k+h\right)^{s}}$$
61 zeta (s,h) = > --------
68 Ejecútese @code{load ("bffac")} antes de hacer uso de esta función.
75 @deffn {Función} burn (@var{n})
76 Siendo @var{n} entero, Devuelve un número racional que aproxima el
77 @var{n}-ésimo número de Bernoulli. La función @code{burn} aprovecha
78 el hecho de que los números de Bernoulli racionales se pueden aproximar
79 con notable precisión gracias a
83 (- 1) 2 zeta(2 n) (2 n)!
84 B(2 n) = ------------------------------------
89 La función @code{burn} puede ser más eficiente que @code{bern} cuando
90 @var{n} es un número grande, ya que @code{bern} calcula todos los números
91 de Bernoulli hasta el @var{n}-ésimo. Por el contrario, @code{burn} hace
92 uso de la aproximación para enteros pares @var{n} > 255. En caso de
93 enteros impares y @var{n} <= 255, se hace uso de la función @code{bern}.
95 Para utilizar esta función hay que cargarla antes en memoria escribiendo
96 @code{load ("bffac")}. Véase también @code{bern}.
102 @deffn {Función} chinese ([@var{r_1}, @dots{}, @var{r_n}], [@var{m_1}, @dots{}, @var{m_n}])
104 Resulve el sistema de congruencias @code{x = r_1 mod m_1}, @dots{}, @code{x = r_n mod m_n}.
105 Los restos @var{r_n} pueden ser enteros arbitrarios, mientras que los módulos @var{m_n}
106 deben ser positivos y primos dos a dos.
109 (%i1) mods : [1000, 1001, 1003, 1007];
110 (%o1) [1000, 1001, 1003, 1007]
111 (%i2) lreduce('gcd, mods);
113 (%i3) x : random(apply("*", mods));
115 (%i4) rems : map(lambda([z], mod(x, z)), mods);
116 (%o4) [4, 568, 54, 624]
117 (%i5) chinese(rems, mods);
119 (%i6) chinese([1, 2], [3, n]);
120 (%o6) chinese([1, 2], [3, n])
128 @deffn {Función} cf (@var{expr})
130 Calcula aproximaciones con fracciones continuas. @var{expr} es una expresión
131 que contiene fracciones continuas, raíces cuadradas de enteros,
132 y números reales (enteros, racionales, decimales en coma flotante y decimales de
133 precisión arbitraria). @code{cf} calcula expansiones exactas de números
134 racionales, pero las expansiones de números decimales de coma flotante se truncan
135 de acuerdo con el valor de @code{ratepsilon}, y la de los de decimales de precisión
136 arbitraria (bigfloats) lo hacen respecto de @code{10^(-fpprec)}.
138 En las expresiones se pueden combinar operandos con operadores aritméticos.
139 Maxima no conoce operaciones con fracciones continuas más allá de
140 la función @code{cf}.
142 La función @code{cf} evalúa sus argumentos después de asignar a la
143 variable @code{listarith} el valor @code{false}, retornando una fracción
144 continua en forma de lista.
146 Una fracción continua @code{a + 1/(b + 1/(c + ...))} se representa como la
147 lista @code{[a, b, c, ...]}, donde los elementos @code{a}, @code{b}, @code{c}, ...
148 se evalúan como enteros. La expresión @var{expr} puede contener también
149 @code{sqrt (n)} donde @code{n} es un entero; en tal caso, @code{cf} devolverá
150 tantos términos de la fracción continua como indique el valor de la variable
151 @code{cflength} multiplicado por el período.
153 Una fracción continua puede reducirse a un número evaluando la representación
154 aritmética que devuelve @code{cfdisrep}. Véase también @code{cfexpand},
155 que es otra alternativa para evaluar fracciones continuas.
157 Véanse asimismo @code{cfdisrep}, @code{cfexpand} y @code{cflength}.
163 La expresión @var{expr} contiene fracciones continuas y raíces
164 cuadradas de enteros.
167 (%i1) cf ([5, 3, 1]*[11, 9, 7] + [3, 7]/[4, 3, 2]);
168 (%o1) [59, 17, 2, 1, 1, 1, 27]
169 (%i2) cf ((3/17)*[1, -2, 5]/sqrt(11) + (8/13));
170 (%o2) [0, 1, 1, 1, 3, 2, 1, 4, 1, 9, 1, 9, 2]
174 La variable @code{cflength} controla cuantos períodos de la fracción
175 continua se calculan para números irracionales algebraicos.
179 (%i2) cf ((1 + sqrt(5))/2);
180 (%o2) [1, 1, 1, 1, 2]
182 (%i4) cf ((1 + sqrt(5))/2);
183 (%o4) [1, 1, 1, 1, 1, 1, 1, 2]
185 (%i6) cf ((1 + sqrt(5))/2);
186 (%o6) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2]
190 Una fracción continua puede calcularse evaluando la representación aritmética
191 que devuelve @code{cfdisrep}.
195 (%i2) cfdisrep (cf (sqrt (3)))$
197 (%o3) 1.731707317073171
201 Maxima no sabe sobre operaciones con fracciones continuas más de lo que aporta
202 la función @code{cf}.
205 (%i1) cf ([1,1,1,1,1,2] * 3);
207 (%i2) cf ([1,1,1,1,1,2]) * 3;
208 (%o2) [3, 3, 3, 3, 3, 6]
217 @deffn {Función} cfdisrep (@var{lista})
218 Construye y devuelve una expresión aritmética ordinaria de la forma @code{a + 1/(b + 1/(c + ...))} a partir de la representación en formato lista de la fracción continua @code{[a, b, c, ...]}.
221 (%i1) cf ([1, 2, -3] + [1, -2, 1]);
238 @deffn {Función} cfexpand (@var{x})
239 Devuelve la matriz con los numeradores y denominadores de la última (columna 1) y penúltima (columna 2) convergentes de la fracción continua @var{x}.
242 (%i1) cf (rat (ev (%pi, numer)));
244 `rat' replaced 3.141592653589793 by 103993/33102 =3.141592653011902
245 (%o1) [3, 7, 15, 1, 292]
250 (%i3) %[1,1]/%[2,1], numer;
251 (%o3) 3.141592653011902
256 @defvr {Variable opcional} cflength
259 La variable @code{cflength} controla el número de términos de la fracción continua que devuelve la función @code{cf}, que será @code{cflength} multiplicado por el período. Así, el valor por defecto será el de un período.
263 (%i2) cf ((1 + sqrt(5))/2);
264 (%o2) [1, 1, 1, 1, 2]
266 (%i4) cf ((1 + sqrt(5))/2);
267 (%o4) [1, 1, 1, 1, 1, 1, 1, 2]
269 (%i6) cf ((1 + sqrt(5))/2);
270 (%o6) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2]
278 @deffn {Función} divsum (@var{n}, @var{k})
279 @deffnx {Función} divsum (@var{n})
281 La llamada @code{divsum (@var{n}, @var{k})} devuelve la suma de los divisores de @var{n} elevados a la @var{k}-ésima potencia.
283 La llamada @code{divsum (@var{n})} devuelve la suma de los divisores de @var{n}.
288 (%i2) 1 + 2 + 3 + 4 + 6 + 12;
290 (%i3) divsum (12, 2);
292 (%i4) 1^2 + 2^2 + 3^2 + 4^2 + 6^2 + 12^2;
299 @deffn {Función} euler (@var{n})
300 Devuelve el @var{n}-ésimo número de Euler del entero no negativo @var{n}.
301 Los número de Euler iguales a cero se eliminan si @code{zerobern} vale @code{false}.
303 Para la constante de Euler-Mascheroni, véase @code{%gamma}.
306 (%i1) zerobern: true$
307 (%i2) map (euler, [0, 1, 2, 3, 4, 5, 6]);
308 (%o2) [1, 0, - 1, 0, 5, 0, - 61]
309 (%i3) zerobern: false$
310 (%i4) map (euler, [0, 1, 2, 3, 4, 5, 6]);
311 (%o4) [1, - 1, 5, - 61, 1385, - 50521, 2702765]
318 @defvr {Variable opcional} factors_only
319 Valor por defecto: @code{false}
321 Controla el resultado devuelto por @code{ifactors}. El valor por defecto
322 @code{false} hace que @code{ifactors} no dé información sobre las
323 multiplicidades de los factores primos calculados. Cuando @code{factors_only}
324 vale @code{true}, @code{ifactors} solo devuelve la lista de factores primos.
326 Para ejemplos, véase @code{ifactors}.
331 @deffn {Función} fib (@var{n})
332 Devuelve el @var{n}-ésimo número de Fibonacci. La llamada @code{fib(0)}
333 devuelve 0, @code{fib(1)} devuelve 1 y @code{fib (-@var{n})} es igual a
334 @code{(-1)^(@var{n} + 1) * fib(@var{n})}.
336 Después de llamar a @code{fib}, la variable @code{prevfib} toma el valor
337 @code{fib (@var{n} - 1)}, que es el número de Fibonacci que precede al último calculado.
340 (%i1) map (fib, [-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8]);
341 (%o1) [- 3, 2, - 1, 1, 0, 1, 1, 2, 3, 5, 8, 13, 21]
346 @deffn {Función} fibtophi (@var{expr})
347 Expresa los números de Fibonacci en @var{expr} en términos de la razón áurea @code{%phi},
348 que es @code{(1 + sqrt(5))/2}, aproximadamente 1.61803399.
353 @c fibtophi (fib (n));
354 @c fib (n-1) + fib (n) - fib (n+1);
359 (%i1) fibtophi (fib (n));
362 (%o1) -------------------
364 (%i2) fib (n-1) + fib (n) - fib (n+1);
365 (%o2) - fib(n + 1) + fib(n) + fib(n - 1)
368 %phi - (1 - %phi) %phi - (1 - %phi)
369 (%o3) - --------------------------- + -------------------
370 2 %phi - 1 2 %phi - 1
373 + ---------------------------
384 @deffn {Función} ifactors (@var{n})
385 Devuelve la factorización del entero positivo @var{n}. Si @code{n=p1^e1..pk^nk} es
386 la descomposición de @var{n} en números primos, @code{ifactors} devuelve
387 @code{[[p1, e1], ... , [pk, ek]]}.
389 Los métodos de factorización se basan en divisiones tentativas con números primos
390 hasta 9973, en los métodos rho y p-1 de Pollard y en curvas elípticas.
392 La respuesta que se obtiene de @code{ifactors} está controlada por la variable opcional
393 @code{factors_only}. El valor por defecto @code{false} hace que @code{ifactors} no
394 dé información sobre las multiplicidades de los factores primos calculados.
395 Cuando @code{factors_only} vale @code{true}, @code{ifactors} solo devuelve la lista
399 (%i1) ifactors(51575319651600);
400 (%o1) [[2, 4], [3, 2], [5, 2], [1583, 1], [9050207, 1]]
401 (%i2) apply("*", map(lambda([u], u[1]^u[2]), %));
403 (%i3) ifactors(51575319651600), factors_only : true;
404 (%o3) [2, 3, 5, 1583, 9050207]
411 @deffn {Función} igcdex (@var{n}, @var{k})
413 Devuelve la lista @code{[@var{a}, @var{b}, @var{u}]}, donde @var{u} es
414 el máximo común divisor de @var{n} y @var{k}, siendo @var{u}
415 igual a @code{@var{a} @var{n} + @var{b} @var{k}}. Los argumentos
416 @var{n} y @var{k} deben ser enteros.
418 @code{igcdex} implementa el algoritmo de Euclides. Véase también @code{gcdex}.
420 La instrucción @code{load("gcdex")} carga esta función.
429 (%i3) igcdex(1526757668, 7835626735736);
430 (%o3) [845922341123, - 164826435, 4]
431 (%i4) igcdex(fib(20), fib(21));
432 (%o4) [4181, - 2584, 1]
440 @deffn {Función} inrt (@var{x}, @var{n})
441 Devuelve la raíz entera @var{n}-ésima del valor absoluto de @var{x}.
444 (%i1) l: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]$
445 (%i2) map (lambda ([a], inrt (10^a, 3)), l);
446 (%o2) [2, 4, 10, 21, 46, 100, 215, 464, 1000, 2154, 4641, 10000]
451 @deffn {Función} inv_mod (@var{n}, @var{m})
452 Calcula el inverso de @var{n} módulo @var{m}.
453 La llamada @code{inv_mod (n,m)} devuelve @code{false}
454 si @var{n} es un divisor nulo módulo @var{m}.
457 (%i1) inv_mod(3, 41);
459 (%i2) ratsimp(3^-1), modulus = 41;
461 (%i3) inv_mod(3, 42);
468 @deffn {Función} isqrt (@var{x})
469 Devuelve la "raíz cuadrada entera"
470 del valor absoluto de @var{x},
471 el cual debe ser un entero.
477 @deffn {Función} jacobi (@var{p}, @var{q})
478 Devuelve el símbolo de Jacobi para @var{p} y @var{q}.
481 (%i1) l: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]$
482 (%i2) map (lambda ([a], jacobi (a, 9)), l);
483 (%o2) [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0]
488 @deffn {Función} lcm (@var{expr_1}, ..., @var{expr_n})
489 Devuelve el mínimo común múltiplo de sus argumentos.
490 Los argumentos pueden ser tanto expresiones en general como enteros.
492 Es necesario cargar en memoria esta función haciendo @code{load ("functs")}.
500 @deffn {Función} lucas (@var{n})
501 Devuelve el @var{n}-ésimo número de Lucas.
502 @code{lucas(0)} es igual a 2, @code{lucas(1)} es igual a 1 y
503 @code{lucas(-@var{n})} es igual a @code{(-1)^(-@var{n}) * lucas(@var{n})}.
506 (%i1) map (lucas, [-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8]);
507 (%o1) [7, - 4, 3, - 1, 2, 1, 3, 4, 7, 11, 18, 29, 47]
510 Después de llamar a @code{lucas}, la variable global @code{next_lucas}
511 es igual a @code{lucas (@var{n} + 1)}, el número de Lucas que sigue al
512 último que se ha devuelto. El ejemplo muestra como los números de
513 Fibonacci se pueden calcular mediante @code{lucas} y @code{next_lucas}.
516 (%i1) fib_via_lucas(n) :=
517 block([lucas : lucas(n)],
518 signum(n) * (2*next_lucas - lucas)/5 )$
519 (%i2) map (fib_via_lucas, [-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8]);
520 (%o2) [- 3, 2, - 1, 1, 0, 1, 1, 2, 3, 5, 8, 13, 21]
529 @deffn {Función} mod (@var{x}, @var{y})
531 Si @var{x} e @var{y} son números reales e @var{y} es distinto de cero,
532 devuelve @code{@var{x} - @var{y} * floor(@var{x} / @var{y})}.
533 Para todos los reales @var{x}, se tiene @code{mod (@var{x}, 0) = @var{x}}. Para información sobre la definición de @code{mod (@var{x}, 0) = @var{x}}, véase la sección 3.4 de "Concrete Mathematics",
534 by Graham, Knuth, and Patashnik. La función @code{mod (@var{x}, 1)} es de diente de sierra con periodo unidad y con @code{mod (1, 1) = 0} y @code{mod (0, 1) = 0}.
536 Para encontrar el argumento principal (un número del intervalo @code{(-%pi, %pi]}) de un número complejo, hágase uso de la función @code{@var{x} |-> %pi - mod (%pi - @var{x}, 2*%pi)}, donde @var{x} es un argumento.
538 Si @var{x} e @var{y} son expresiones constantes (por ejemplo, @code{10 * %pi}), @code{mod} utiliza el mismo esquema de evaluación basado en números grandes en coma flotante (big floats) que @code{floor} y @code{ceiling}. También es posible, pero improbable, que @code{mod} pueda retornar un valor erróneo en tales casos.
540 Para argumentos no numéricos @var{x} o @var{y}, @code{mod} aplica algunas reglas de simplificación:
550 (%i2) mod (a*x, a*y);
559 @deffn {Función} next_prime (@var{n})
560 Devuelve el menor de los primos mayores que @var{n}.
563 (%i1) next_prime(27);
570 @deffn {Función} partfrac (@var{expr}, @var{var})
571 Expande la expresión @var{expr} en fracciones parciales respecto de la variable principal @var{var}. La función @code{partfrac} hace una descomposición completa en fracciones parciales. El algoritmo que se utiliza se basa en el hecho de que los denominadores de la expansión en fracciones parciales (los factores del denominador original) son primos relativos. Los numeradores se pueden escribir como combinaciones lineales de los denominadores.
574 (%i1) 1/(1+x)^2 - 2/(1+x) + 2/(2+x);
576 (%o1) ----- - ----- + --------
581 (%o2) - -------------------
584 (%i3) partfrac (%, x);
586 (%o3) ----- - ----- + --------
596 @deffn {Función} power_mod (@var{a}, @var{n}, @var{m})
597 Utiliza un algoritmo modular para calcular @code{a^n mod m},
598 siendo @var{a} y @var{n} enteros cualesquiera y @var{m} un entero positivo.
599 Si @var{n} es negativo, se utilizará @code{inv_mod} para encontrar el
603 (%i1) power_mod(3, 15, 5);
607 (%i3) power_mod(2, -1, 5);
615 @deffn {Función} primep (@var{n})
616 Comprueba si el número entero @var{n} es o no primo, devolviendo @code{true}
617 o @code{false} según el caso.
619 Cuando el resultado de @code{primep (@var{n})} es @code{false}, @var{n} es un
620 número compuesto, y si es @code{true}, @var{n} es primo con alta probabilidad.
622 Si @var{n} es menor que 3317044064679887385961981, se utiliza una versión
623 determinística de la prueba de Miller-Rabin. En tal caso,
624 si @code{primep (@var{n})} devuelve @code{true}, entonces @var{n} es un número primo.
626 Para @var{n} mayor que 3317044064679887385961981 @code{primep} realiza
627 @code{primep_number_of_tests} pruebas de seudo-primalidad de Miller-Rabin y una
628 prueba de seudo-primalidad de Lucas. La probabilidad de que un número compuesto
629 @var{n} pase una prueba de Miller-Rabin es menor que 1/4. Con el valor por defecto de
630 @code{primep_number_of_tests}, que es 25, la probabilidad de que @var{n}
631 sea compuesto es menor que 10^-15.
638 @defvr {Variable opcional} primep_number_of_tests
639 Valor por defecto: 25
641 Número de pruebas de Miller-Rabin a realizar por @code{primep}.
644 @deffn {Función} prev_prime (@var{n})
645 Devuelve el mayor de los primos menores que @var{n}.
648 (%i1) prev_prime(27);
654 @deffn {Función} qunit (@var{n})
655 Devuelve la unidad principal de @code{sqrt (@var{n})}, siendo @var{n} un entero; consiste en la resolución de la ecuación de Pell @code{a^2 - @var{n} b^2 = 1}.
660 (%i2) expand (% * (sqrt(17) - 4));
668 @deffn {Función} totient (@var{n})
669 Devuelve el número de enteros menores o iguales a @var{n} que son primos relativos con @var{n}.
672 @defvr {Variable opcional} zerobern
673 Valor por defecto: @code{true}
675 Si @code{zerobern} vale @code{false}, @code{bern} excluye los números de Bernoulli
676 y @code{euler} excluye los números de Euler que sean iguales a cero.
677 Véase @code{bern} y @code{euler}.
683 @deffn {Función} zeta (@var{n})
684 Devuelve la función zeta de Riemann. Si @var{n} es entero negativo,
685 0 o número par positivo, la función zeta de Riemann devuelve un
686 valor exacto; en el caso de número par positivo, la variable opcional
687 @code{zeta%pi}, además, tiene que tener el valor @code{true}
688 (véase @code{zeta%pi}).
689 Cuando el argumento es un número decimal o bigfloat,
690 entonces la función zeta de Riemann se calcula numéricamente.
691 Maxima devuelve una forma nominal @code{zeta (@var{n})} para
692 cualesquiera otros argumentos, incluidos los racionales no enteros,
693 los números complejos y los enteros pares si @code{zeta%pi} vale
696 @code{zeta(1)} no está definida, pero Maxima conce el límite
697 de @code{limit(zeta(x), x, 1)} por ambos lados.
699 La función zeta de Riemann se distribuye sobre las listas, matrices
702 Véanse también @code{bfzeta} y @code{zeta%pi}.
707 @c zeta([-2,-1,0,0.5,2,3,1+%i]);
708 @c limit(zeta(x),x,1,plus);
709 @c limit(zeta(x),x,1,minus);
712 (%i1) zeta([-2,-1,0,0.5,2,3,1+%i]);
715 (%o1) [0, - --, - -, - 1.460354508809587, ----, zeta(3), zeta(%i + 1)]
718 (%i2) limit(zeta(x),x,1,plus);
720 (%i3) limit(zeta(x),x,1,minus);
730 @defvr {Variable opcional} zeta%pi
731 Valor por defecto: @code{true}
733 Si @code{zeta%pi} vale @code{true}, @code{zeta} devuelve una expresión proporcional a @code{%pi^n} si @code{n} es un número par positivo. En caso contrario, @code{zeta} no se evalúa y devuelve la forma nominal @code{zeta (n)}.
750 (%i3) zeta%pi: false$
762 @deffn {Función} zn_add_table (@var{n})
763 Muestra la tabla de la suma de todos los elementos de (Z/@var{n}Z).
765 Véanse también @code{zn_mult_table} y @code{zn_power_table}.
775 @deffn {Función} zn_determinant (@var{matrix}, @var{p})
776 Utiliza el procedimiento de la descomposición LU para calcular el determinante
777 de @var{matrix} sobre (Z/@var{p}Z). El argumento @var{p} debe ser un número primo.
779 Si el determinante es igual a cero, el procedimiento puede fallar, en cuyo caso
780 @code{zn_determinant} calcula el determinante no modular y luego reduce.
782 Véase también @code{zn_invert_by_lu}.
787 (%i1) m : matrix([1,3],[2,4]);
791 (%i2) zn_determinant(m, 5);
793 (%i3) m : matrix([2,4,1],[3,1,4],[4,3,2]);
799 (%i4) zn_determinant(m, 5);
809 @deffn {Función} zn_invert_by_lu (@var{matrix}, @var{p})
810 Utiliza el procedimiento de la descomposición LU para calcular la inversa
811 modular de @var{matrix} sobre (Z/@var{p}Z). El argumento @var{p} debe ser
812 un número primo y @var{matrix} invertible. La función @code{zn_invert_by_lu}
813 devuelve @code{false} si @var{matrix} no es invertible.
815 Véase @code{zn_determinant}.
820 (%i1) m : matrix([1,3],[2,4]);
824 (%i2) zn_determinant(m, 5);
826 (%i3) mi : zn_invert_by_lu(m, 5);
830 (%i4) matrixmap(lambda([a], mod(a, 5)), m . mi);
843 @deffn {Función} zn_log (@var{a}, @var{g}, @var{n})
844 @deffnx {Función} zn_log (@var{a}, @var{g}, @var{n}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
845 Calcula el logaritmo discreto. Sea (Z/@var{n}Z)* un grupo cíclico,
846 @var{g} una raíz primitiva módulo @var{n} y @var{a} un miembro
847 de este grupo, entonces @code{zn_log (a, g, n)} calcula la congruencia @code{g^x = a mod n}.
849 El algoritmo que se aplica necesita una factorización prima de @code{totient(n)}. Esta
850 factorización puede requerir mucho tiempo de cálculo, por lo que en ciertos casos puede
851 ser aconsejable factorizar primero y luego pasar la lista de factores a @code{zn_log} como
852 cuarto argumento. La lista debe ser de la misma forma que las lista devuelta por
853 @code{ifactors(totient(n))} utilizando la opción por defecto @code{factors_only : false}.
855 El algoritmo utiliza la reducción de Pohlig-Hellman y el método Rho de Pollard
856 para los logaritmos discretos. El tiempo de ejecución de @code{zn_log} depende en
857 primer lugar del número de bits del mayor factor primo del totient.
859 Véanse también @code{zn_primroot}, @code{zn_order}, @code{ifactors} y @code{totient}.
863 @code{zn_log (a, g, n)} resuelve la congruencia @code{g^x = a mod n}.
867 (%i2) g : zn_primroot(n);
869 (%i3) ord_7 : zn_order(7, n);
871 (%i4) powers_7 : makelist(power_mod(g, x, n), x, 0, ord_7 - 1);
872 (%o4) [1, 7, 5, 13, 3, 21, 15, 17, 9, 19]
873 (%i5) zn_log(21, g, n);
875 (%i6) map(lambda([x], zn_log(x, g, n)), powers_7);
876 (%o6) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
879 El cuarto argumento opcional debe ser de la misma forma que la lista devuelta por
880 @code{ifactors(totient(n))}.
883 (%i1) (p : 2^127-1, primep(p));
885 (%i2) ifs : ifactors(p - 1)$
886 (%i3) g : zn_primroot(p, ifs);
888 (%i4) a : power_mod(g, 1234567890, p)$
889 (%i5) zn_log(a, g, p, ifs);
893 (%i7) f_max : last(ifs);
894 (%o7) [77158673929, 1]
895 (%i8) slength( printf(false, "~b", f_max[1]) );
906 @deffn {Función} zn_mult_table (@var{n})
907 @deffnx {Función} zn_mult_table (@var{n}, all)
908 Sin el argumento opcional @var{all}, @code{zn_mult_table(n)}
909 muestra la tabla de multiplicación de los elementos de (Z/@var{n}Z)*,
910 que son todos elementos invertibles módulo @var{n}.
912 El argumento opcional @var{all} hace que la tabla se genere para todos los
915 Véanse también @code{zn_add_table} y @code{zn_power_table}.
920 (%i1) zn_mult_table(4);
924 (%i2) zn_mult_table(4, all);
940 @deffn {Función} zn_order (@var{x}, @var{n})
941 @deffnx {Función} zn_order (@var{x}, @var{n}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
942 Devuelve el orden de @var{x} si es una unidad del grupo finito (Z/@var{n}Z)*, o devuelve @code{false}.
943 @var{x} una unidad módulo @var{n} si es coprimo con @var{n}.
945 El algoritmo que se aplica necesita una factorización prima de @code{totient(n)}. Esta
946 factorización puede requerir mucho tiempo de cálculo, por lo que en ciertos casos puede
947 ser aconsejable factorizar primero y luego pasar la lista de factores a @code{zn_log} como
948 tercer argumento. La lista debe ser de la misma forma que las lista devuelta por
949 @code{ifactors(totient(n))} utilizando la opción por defecto @code{factors_only : false}.
951 Véanse también @code{zn_primroot}, @code{ifactors} y @code{totient}.
955 @code{zn_order} calcula el orden de la unidad @var{x} en (Z/@var{n}Z)*.
959 (%i2) g : zn_primroot(n);
961 (%i3) units_22 : sublist(makelist(i,i,1,21), lambda([x], gcd(x, n) = 1));
962 (%o3) [1, 3, 5, 7, 9, 13, 15, 17, 19, 21]
963 (%i4) (ord_7 : zn_order(7, n)) = totient(n);
965 (%i5) powers_7 : makelist(power_mod(g,i,n), i,0,ord_7 - 1);
966 (%o5) [1, 7, 5, 13, 3, 21, 15, 17, 9, 19]
967 (%i6) map(lambda([x], zn_order(x, n)), powers_7);
968 (%o6) [1, 10, 5, 10, 5, 2, 5, 10, 5, 10]
969 (%i7) map(lambda([x], ord_7/gcd(x, ord_7)), makelist(i, i,0,ord_7 - 1));
970 (%o7) [1, 10, 5, 10, 5, 2, 5, 10, 5, 10]
971 (%i8) totient(totient(n));
975 El tercer argumento opcional debe ser de la misma forma que la lista devuelta
976 por @code{ifactors(totient(n))}.
979 (%i1) (p : 2^142 + 217, primep(p));
981 (%i2) ifs : ifactors( totient(p) )$
982 (%i3) g : zn_primroot(p, ifs);
984 (%i4) is( (ord_3 : zn_order(g, p, ifs)) = totient(p) );
986 (%i5) map(lambda([x], ord_3/zn_order(x, p, ifs)), makelist(i,i,2,15));
987 (%o5) [22, 1, 44, 10, 5, 2, 22, 2, 8, 2, 1, 1, 20, 1]
996 @deffn {Función} zn_power_table (@var{n})
997 @deffnx {Función} zn_power_table (@var{n}, all)
998 Sin el argumento opcional @var{all}, @code{zn_power_table(n)}
999 muestra la tabla de potencias de los elementos de (Z/@var{n}Z)*,
1000 que son todos elementos invertibles módulo @var{n}. El exponente
1001 se obtiene con un bucle desde @code{1} hasta @code{totient(n)}
1002 y la tabla termina con una columna de unos al lado derecho.
1004 El argumento opcional @var{all} hace que la tabla se genere para todos los
1005 elementos no nulos. En este caso, el exponente se calcula con un bucle desde
1006 @code{1} hasta @code{totient(n) + 1} y la última columna es por lo tanto
1009 Véanse también @code{zn_add_table} y @code{zn_mult_table}.
1014 (%i1) zn_power_table(6);
1018 (%i2) zn_power_table(6, all);
1037 @deffn {Función} zn_primroot (@var{n})
1038 @deffnx {Función} zn_primroot (@var{n}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
1039 Si el grupo multiplicativo es cíclico, @code{zn_primroot}
1040 calcula la menor raíz primitiva de módulo @var{n}. (Z/@var{n}Z)* es
1041 cíclico si @var{n} es igual a @code{2}, @code{4}, @code{p^k} o @code{2*p^k},
1042 siendo @code{p} primo y mayor que @code{2} y @code{k} un número natural.
1043 Si a la variable opcional @code{zn_primroot_pretest}, cuyo valor por defecto es
1044 @code{false}, se le da el valor @code{true}, entonces @code{zn_primroot}
1045 realiza una prueba previa. En cualquier caso, el cálculo está limitado por la
1046 cota superior @code{zn_primroot_limit}.
1048 Si (Z/@var{n}Z)* no es cíclico o si no tiene raíces
1049 primitivas menores que @code{zn_primroot_limit}, @code{zn_primroot} devuelve
1052 El algoritmo que se aplica necesita una factorización prima de @code{totient(n)}. Esta
1053 factorización puede requerir mucho tiempo de cálculo, por lo que en ciertos casos puede
1054 ser aconsejable factorizar primero y luego pasar la lista de factores a @code{zn_log} como
1055 argumento adicional. La lista debe ser de la misma forma que las lista devuelta por
1056 @code{ifactors(totient(n))} utilizando la opción por defecto @code{factors_only : false}.
1058 Véanse también @code{zn_primroot_p}, @code{zn_order}, @code{ifactors} y @code{totient}.
1062 @code{zn_primroot} calcula la menor raíz primitiva de módulo @var{n} o
1063 devuelve @code{false}.
1067 (%i2) g : zn_primroot(n);
1069 (%i3) zn_order(g, n) = totient(n);
1072 (%i5) zn_primroot(n);
1076 El argumento opcional debe ser de la misma forma que la lista devuelta
1077 por @code{ifactors(totient(n))}.
1080 (%i1) (p : 2^142 + 217, primep(p));
1082 (%i2) ifs : ifactors( totient(p) )$
1083 (%i3) g : zn_primroot(p, ifs);
1085 (%i4) [time(%o2), time(%o3)];
1086 (%o4) [[15.556972], [0.004]]
1087 (%i5) is(zn_order(g, p, ifs) = p - 1);
1089 (%i6) n : 2^142 + 216$
1090 (%i7) ifs : ifactors(totient(n))$
1091 (%i8) zn_primroot(n, ifs),
1092 zn_primroot_limit : 200, zn_primroot_verbose : true;
1093 `zn_primroot' stopped at zn_primroot_limit = 200
1104 @defvr {Option variable} zn_primroot_limit
1105 Valor por defecto: @code{1000}
1107 Si @code{zn_primroot} no puede encontrar una raíz primitiva,
1108 entonces se para en esta cota superior. Si a la variable opcional
1109 @code{zn_primroot_verbose} se le da el valor @code{true}, se imprimirá un
1110 mensaje cuando @code{zn_primroot_limit} sea alcanzado.
1120 @deffn {Función} zn_primroot_p (@var{x}, @var{n})
1121 @deffnx {Función} zn_primroot_p (@var{x}, @var{n}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
1122 Comprueba si @var{x} es una raíz primitiva en el
1123 grupo multiplizativo (Z/@var{n}Z)*.
1125 El algoritmo que se aplica necesita una factorización prima de @code{totient(n)}. Esta
1126 factorización puede requerir mucho tiempo de cálculo, por lo que en ciertos casos puede
1127 ser aconsejable factorizar primero y luego pasar la lista de factores a @code{zn_log} como
1128 tercer argumento. La lista debe ser de la misma forma que las lista devuelta por
1129 @code{ifactors(totient(n))} utilizando la opción por defecto @code{factors_only : false}.
1131 Véanse también @code{zn_primroot}, @code{zn_order}, @code{ifactors} y @code{totient}.
1135 @code{zn_primroot_p} como función de predicado.
1139 (%i2) units_14 : sublist(makelist(i,i,1,13), lambda([i], gcd(i, n) = 1));
1140 (%o2) [1, 3, 5, 9, 11, 13]
1141 (%i3) zn_primroot_p(13, n);
1143 (%i4) sublist(units_14, lambda([x], zn_primroot_p(x, n)));
1145 (%i5) map(lambda([x], zn_order(x, n)), units_14);
1146 (%o5) [1, 6, 6, 3, 3, 2]
1149 El tercer argumento opcional debe ser de la misma forma que la lista
1150 devuelta por @code{ifactors(totient(n))}.
1153 (%i1) (p : 2^142 + 217, primep(p));
1155 (%i2) ifs : ifactors( totient(p) )$
1156 (%i3) sublist(makelist(i,i,1,50), lambda([x], zn_primroot_p(x, p, ifs)));
1157 (%o3) [3, 12, 13, 15, 21, 24, 26, 27, 29, 33, 38, 42, 48]
1158 (%i4) [time(%o2), time(%o3)];
1159 (%o4) [[7.748484], [0.036002]]
1169 @defvr {Option variable} zn_primroot_pretest
1170 Valor por defecto: @code{false}
1172 El grupo multiplicativo (Z/@var{n}Z)* es cíclico si if @var{n}
1173 es igual a @code{2}, @code{4}, @code{p^k} o @code{2*p^k}, siendo @code{p}
1174 un número primo mayor que @code{2} y @code{k} es un número natural.
1176 La variable @code{zn_primroot_pretest} controla si @code{zn_primroot} debe
1177 comprobar si sucede alguna de estas situaciones antes de calcular la menor
1178 raíz primitiva. Solo se realizará esta comprobación si
1179 @code{zn_primroot_pretest} toma el valor @code{true}.
1189 @defvr {Option variable} zn_primroot_verbose
1190 Valor por defecto: @code{false}
1192 Controla si @code{zn_primroot} imprime un mensaje cuando alcanza @code{zn_primroot_limit}.