1 @c -----------------------------------------------------------------------------
2 @c File : Number.de.texi
3 @c License : GNU General Public License (GPL)
5 @c Original : Number.texi revision 1.35
6 @c Translation : Dr. Dieter Kaiser
8 @c Revision : 26.02.2011
10 @c This file is part of Maxima -- GPL CAS based on DOE-MACSYMA
11 @c -----------------------------------------------------------------------------
14 * Funktionen und Variablen der Zahlentheorie::
17 @c -----------------------------------------------------------------------------
18 @node Funktionen und Variablen der Zahlentheorie, , Zahlentheorie, Zahlentheorie
19 @section Funktionen und Variablen der Zahlentheorie
21 @c --- 23.11.2010 DK -----------------------------------------------------------
23 @deffn {Funktion} bern (@var{n})
25 @c Returns the @var{n}'th Bernoulli number for integer @var{n}.
26 @c WELL, ACTUALLY bern SIMPLIFIES, LIKE FACTORIAL -- DO WE WANT TO GET INTO THAT
27 @c OR JUST PRETEND IT'S "RETURNED" ???
28 @c Bernoulli numbers equal to zero are suppressed if @code{zerobern} is
31 Gibt die @var{n}-te Bernoulli-Zahl der ganzen Zahl @var{n} zur@"uck. Hat die
32 Optionsvariable @code{zerobern} den Wert @code{false}, werden Bernoulli-Zahlen
33 unterdr@"uckt, die Null sind.
35 Siehe auch @mrefdot{burn}
40 (%i2) map (bern, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
42 (%o2) [1, - -, -, 0, - --, 0, --, 0, - --]
45 (%i3) zerobern: false$
46 (%i4) map (bern, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
47 1 1 1 5 691 7 3617 43867
48 (%o4) [1, - -, -, - --, --, - ----, -, - ----, -----]
49 2 6 30 66 2730 6 510 798
53 @c --- 23.11.2010 DK -----------------------------------------------------------
55 @deffn {Funktion} bernpoly (@var{x}, @var{n})
57 @c Returns the @var{n}'th Bernoulli polynomial in the variable @var{x}.
59 Gibt das @var{n}-te Bernoulli-Polynom in der Variablen @var{x} zur@"uck.
62 @c TODO: DIE FUNKTION ZETA KANN INZWISCHEN IN BELIEBIGER GENAUIGKEIT RECHNEN.
64 @c --- 23.11.2010 DK -----------------------------------------------------------
66 @deffn {Function} bfzeta (@var{s}, @var{n})
68 @c Returns the Riemann zeta function for the argument @var{s}. The return value
69 @c is a big float (bfloat); @var{n} is the number of digits in the return value.
71 Die Riemannsche Zeta-Funktion f@"ur das Argument @var{s}, die wie folgt
75 $$\zeta\left(s\right)=\sum_{k=1}^{\infty }{{{1}\over{k^{s}}}}$$
89 @code{bfzeta} gibt einen Wert als gro@ss{}e Gleitkommazahl zur@"uck. Die Anzahl
90 der Stellen wird durch das Argument @var{n} angegeben.
92 Anstatt der Funktion @code{bfzeta} ist die Funktion @mref{zeta} zu bevorzugen,
93 die sowohl f@"ur reelle und komplexe Gleitkommazahlen und Gleitkommazahlen mit
94 eine beliebigen Genauigkeit die Riemannsche Zeta-Funktion berechnen kann.
97 @c --- 23.11.2010 DK -----------------------------------------------------------
99 @deffn {Funktion} bfhzeta (@var{s}, @var{h}, @var{n})
101 @c Returns the Hurwitz zeta function for the arguments @var{s} and @var{h}.
102 @c The return value is a big float (bfloat); @var{n} is the number of digits in
105 @c The Hurwitz zeta function is defined as
107 Die Hurwitzsche Zeta-Funktion f@"ur die Argumente @var{s} und @var{h}, die wie
111 $$\zeta \left(s,h\right) = \sum_{k=0}^\infty {1 \over \left(k+h\right)^{s}}$$
118 zeta (s,h) = > --------
125 @code{bfhzeta} gibt einen Wert als gro@ss{}e Gleitkommazahl zur@"uck. Die
126 Anzahl der Stellen wird durch das Argument @var{n} angegeben.
128 @c @code{load ("bffac")} loads this function.
131 @c --- 27.11.2010 DK -----------------------------------------------------------
133 @deffn {Funktion} burn (@var{n})
135 @c Returns a rational number, which is an approximation of the @var{n}'th
136 @c Bernoulli number for integer @var{n}. @code{burn} exploits the observation
137 @c that (rational) Bernoulli numbers can be approximated by (transcendental)
138 @c zetas with tolerable efficiency:
140 Gibt eine rational Zahl zur@"uck, die eine N@"aherung f@"ur die @var{n}-te
141 Bernoulli Zahl f@"ur die ganze Zahl @var{n} ist. @code{burn} berechnet eine
142 N@"aherung als gro@ss{}e Gleitkommatzahl mit der folgenden Beziehung:
146 (- 1) 2 zeta(2 n) (2 n)!
147 B(2 n) = ------------------------------------
152 @c @code{burn} may be more efficient than @code{bern} for large, isolated
153 @c @var{n} as @code{bern} computes all the Bernoulli numbers up to index @var{n}
154 @c before returning. @code{burn} invokes the approximation for even integers
155 @c @var{n} > 255. For odd integers and @var{n} <= 255 the function @code{bern}
158 @code{burn} kann effizienter als die Funktion @code{bern} f@"ur gro@ss{}e,
159 einzelne ganze Zahlen @var{n} sein, da @code{bern} zun@"achst alle Bernoulli
160 Zahlen bis @var{n} berechnet. @code{burn} ruft f@"ur ungerade ganze Zahlen und
161 Zahlen die kleiner oder gleich 255 die Funktion @code{bern} auf.
163 @c @code{load ("bffac")} loads this function. See also @code{bern}.
165 Das Kommando @code{load("bffac")} l@"adt die Funktion. Siehe auch @mrefdot{bern}
168 @c --- 27.03.2012 VN -----------------------------------------------------------
170 @deffn {Funktion} chinese ([@var{r_1}, @dots{}, @var{r_n}], [@var{m_1}, @dots{}, @var{m_n}])
172 L@"ost die simultanen Kongruenzen @code{x = r_1 mod m_1}, @dots{}, @code{x = r_n mod m_n}.
173 Die Reste @var{r_n} und die Moduli @var{m_n} m@"ussen ganze Zahlen sein,
174 die Moduli zus@"atzlich positiv und paarweise teilerfremd.
177 (%i1) mods : [1000, 1001, 1003, 1007];
178 (%o1) [1000, 1001, 1003, 1007]
179 (%i2) lreduce('gcd, mods);
181 (%i3) x : random(apply("*", mods));
183 (%i4) rems : map(lambda([z], mod(x, z)), mods);
184 (%o4) [4, 568, 54, 624]
185 (%i5) chinese(rems, mods);
187 (%i6) chinese([1, 2], [3, n]);
188 (%o6) chinese([1, 2], [3, n])
194 @c --- 23.11.2010 DK -----------------------------------------------------------
196 @deffn {Funktion} divsum (@var{n}, @var{k})
197 @deffnx {Funktion} divsum (@var{n})
199 @c @code{divsum (@var{n}, @var{k})} returns the sum of the divisors of @var{n}
200 @c raised to the @var{k}'th power.
202 @code{divsum(@var{n}, @var{k})} potenziert die Teiler des Argumentes @var{n}
203 mit dem Argument @var{k} und gibt die Summe als Ergebnis zur@"uck.
205 @c @code{divsum (@var{n})} returns the sum of the divisors of @var{n}.
207 @code{divsum(@var{n})} gibt die Summe der Teiler der Zahl @var{n} zur@"uck.
212 (%i2) 1 + 2 + 3 + 4 + 6 + 12;
214 (%i3) divsum (12, 2);
216 (%i4) 1^2 + 2^2 + 3^2 + 4^2 + 6^2 + 12^2;
221 @c --- 27.11.2010 DK -----------------------------------------------------------
223 @deffn {Funktion} euler (@var{n})
225 @c Returns the @var{n}'th Euler number for nonnegative integer @var{n}.
227 Gibt die @var{n}-te Eulersche Zahl f@"ur eine nichtnegative ganze Zahl @var{n}
230 @c For the Euler-Mascheroni constant, see @code{%gamma}.
232 F@"ur die Euler-Mascheroni Konstante siehe @mrefdot{%gamma}
237 (%i1) map (euler, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
238 (%o1) [1, 0, - 1, 0, 5, 0, - 61, 0, 1385, 0, - 50521]
242 @c --- 27.07.2013 VvN ----------------------------------------------------------
243 @anchor{factors_only}
244 @defvr {Optionsvariable} factors_only
245 Standardwert: @code{false}
247 Hat @code{factors_only} den Standardwert @code{false}, werden von der
248 Funktion @mref{ifactors} zusammen mit den berechneten Primfaktoren auch deren
249 Multiplizit@"aten angegeben. Hat @code{factors_only} den Wert @code{true},
250 werden nur die Primfaktoren zur@"uck gegeben.
252 Beispiel: Siehe @mref{ifactors}.
255 @c --- 27.07.2013 VvN ----------------------------------------------------------
257 @deffn {Funktion} fib (@var{n})
259 Gibt die @var{n}-te Fibonacci-Zahl zur@"uck. Die Fibonacci-Folge ist rekursiv
265 fib(n) = fib(n-1) + fib(n-2)
268 F@"ur negative ganze Zahlen kann die Fibonacci-Folge wie folgt erweitert werden:
272 fib(- n) = (- 1) fib(n)
275 @c After calling @code{fib}, @code{prevfib} is equal to @code{fib(@var{x} - 1)},
276 @c the Fibonacci number preceding the last one computed.
278 @c TODO: PREVFIB HAT KEINEN EINTRAG.
280 Nach einem Aufruf der Funktion @code{fib(n)}, enth@"alt die Systemvariable
281 @code{prevfib} die zur Zahl @code{n} vorhergehende Fibonacci-Zahl.
284 (%i1) map (fib, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
285 (%o1) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
289 @c --- 23.11.2010 DK -----------------------------------------------------------
291 @deffn {Funktion} fibtophi (@var{expr})
293 @c Expresses Fibonacci numbers in @var{expr} in terms of the constant
294 @c @code{%phi}, which is @code{(1 + sqrt(5))/2}, approximately 1.61803399.
296 Fibonacci-Zahlen im Ausdruck @var{expr} werden durch die Goldene Zahl
297 @code{%phi} ausgedr@"uckt. Siehe @mrefdot{%phi}
302 (%i1) fibtophi (fib (n));
305 (%o1) -------------------
307 (%i2) fib (n-1) + fib (n) - fib (n+1);
308 (%o2) - fib(n + 1) + fib(n) + fib(n - 1)
311 %phi - (1 - %phi) %phi - (1 - %phi)
312 (%o3) - --------------------------- + -------------------
313 2 %phi - 1 2 %phi - 1
316 + ---------------------------
323 @c --- 23.03.2013 VN -----------------------------------------------------------
325 @deffn {Funktion} ifactors (@var{n})
327 Faktorisiert eine positive ganze Zahl @var{n}. Sind @code{n = p1^e1 * ... * pk^nk} die
328 Faktoren der ganzen Zahl @var{n}, dann gibt @code{ifactor} das Ergebnis
329 @code{[[p1, e1], ..., [pk, ek]]} zur@"uck.
331 F@"ur die Faktorisierung kommen Probedivisionen mit Primzahlen bis 9973,
332 Pollards Rho- und p-1-Methode oder Elliptischen Kurven zum Einsatz.
334 Die R@"uckgabe von ifactors wird von der Optionsvariablen @mref{factors_only}
336 Werden lediglich die Primfaktoren ohne ihre Multiplizit@"at ben@"otigt,
337 gen@"ugt es hierf@"ur, @code{factors_only : true} zu setzen.
340 (%i1) ifactors(51575319651600);
341 (%o1) [[2, 4], [3, 2], [5, 2], [1583, 1], [9050207, 1]]
342 (%i2) apply("*", map(lambda([u], u[1]^u[2]), %));
344 (%i3) ifactors(51575319651600), factors_only : true;
345 (%o3) [2, 3, 5, 1583, 9050207]
349 @c --- 23.03.2013 VN -----------------------------------------------------------
351 @deffn {Funktion} igcdex (@var{n}, @var{k})
353 @c Gibt die Liste @code{[@var{a}, @var{b}, @var{u}]} zur@"uck, in der @var{u} der
354 Gibt die Liste @code{[a, b, u]} zur@"uck, in der @code{u} der
355 gr@"o@ss{}te gemeinsame Teiler von @var{n} und @var{k} ist und in der zus@"atzlich
356 @c gilt, dass @code{@var{u} = @var{a} * @var{n} + @var{b} * @var{k}}.
357 gilt, dass @code{u = a * @var{n} + b * @var{k}}.
359 @code{igcdex} verwendet den Euklidischen Algorithmus. Siehe auch @mref{gcdex}.
361 Die Eingabe @code{load("gcdex")} l@"adt diese Funktion.
368 (%i2) igcdex(30, 18);
370 (%i3) igcdex(1526757668, 7835626735736);
371 (%o3) [845922341123, - 164826435, 4]
372 (%i4) igcdex(fib(20), fib(21));
373 (%o4) [4181, - 2584, 1]
377 @c --- 23.11.2010 DK -----------------------------------------------------------
379 @deffn {Funktion} inrt (@var{x}, @var{n})
381 @c Returns the integer @var{n}'th root of the absolute value of @var{x}.
383 Gibt die ganzzahlige @var{n}-te Wurzel des Betrags von @var{x} zur@"uck.
386 (%i1) l: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]$
387 (%i2) map (lambda ([a], inrt (10^a, 3)), l);
388 (%o2) [2, 4, 10, 21, 46, 100, 215, 464, 1000, 2154, 4641, 10000]
392 @c --- 27.03.2012 VN -----------------------------------------------------------
394 @deffn {Funktion} inv_mod (@var{n}, @var{m})
396 Berechnet das modulare Inverse von @var{n} zum Modul @var{m}. Das Argument
397 @var{n} muss eine ganze Zahl und der Modul @var{p} eine positive ganze Zahl
398 sein. @code{inv_mod(n, m)} gibt @code{false} zur@"uck, wenn das modulare Inverse
399 nicht existiert. Das modulare Inverse existiert, wenn @var{n} teilerfremd zum
402 Siehe auch die Funktionen @mref{power_mod} und @mrefdot{mod}
407 (%i1) inv_mod(3, 41);
409 (%i2) ratsimp(3^-1), modulus = 41;
411 (%i3) inv_mod(3, 42);
416 @c --- 20.10.2010 DK -----------------------------------------------------------
418 @deffn {Funktion} isqrt (@var{x})
420 @c Returns the "integer square root" of the absolute value of @var{x}, which is
423 Gibt die ganzzahlige Wurzel des Betrages von @var{x} zur@"uck, wenn @var{x} eine
424 ganze Zahl ist. Andernfalls wird eine Substantivform zur@"uckgegeben.
427 @c --- 27.11.2010 DK -----------------------------------------------------------
429 @deffn {Funktion} jacobi (@var{p}, @var{q})
431 @c Returns the Jacobi symbol of @var{p} and @var{q}.
433 Berechnet das Jacobi-Symbol f@"ur die Argumente @var{p} und @var{q}.
436 (%i1) l: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]$
437 (%i2) map (lambda ([a], jacobi (a, 9)), l);
438 (%o2) [1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0]
442 @c --- 27.03.2012 VN -----------------------------------------------------------
444 @deffn {Funktion} lcm (@var{expr_1}, @dots{}, @var{expr_n})
446 @c Returns the least common multiple of its arguments. The arguments may be
447 @c general expressions as well as integers.
449 Gibt das kleinste gemeinsame Vielfache der Argumente zur@"uck. Die Argumente
450 k@"onnen ganze Zahlen und allgemeine Ausdr@"ucke sein.
452 @c @code{load ("functs")} loads this function.
454 Mit dem Kommando @code{load("functs")} wird die Funktion geladen.
457 @c --- 27.07.2013 VvN ----------------------------------------------------------
459 @deffn {Funktion} lucas (@var{n})
461 Gibt die @var{n}-te Lucas-Zahl zur@"uck. Die Lucas-Folge ist rekursiv
467 lucas(n) = lucas(n-1) + lucas(n-2)
470 F@"ur negative ganze Zahlen kann die Lucas-Folge wie folgt erweitert werden:
474 lucas(- n) = (- 1) lucas(n)
478 (%i1) map (lucas, [-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8]);
479 (%o1) [7, - 4, 3, - 1, 2, 1, 3, 4, 7, 11, 18, 29, 47]
482 Nach einem Aufruf von @code{lucas} enth@"alt die globale Variable
483 @code{next_lucas} den Nachfolger der zuletzt zur@"ck gegebenen Lucas-Zahl.
484 Das Beispiel zeigt, wie Fibonacci-Zahlen mit Hilfe von @code{lucas}
485 und @code{next_lucas} berechnet werden k@"onnen.
488 (%i1) fib_via_lucas(n) :=
489 block([lucas : lucas(n)],
490 signum(n) * (2*next_lucas - lucas)/5 )$
491 (%i2) map (fib_via_lucas, [-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8]);
492 (%o2) [- 3, 2, - 1, 1, 0, 1, 1, 2, 3, 5, 8, 13, 21]
496 @c --- 23.03.2013 VN -----------------------------------------------------------
498 @deffn {Funktion} mod (@var{x}, @var{p})
500 @c If @var{x} and @var{y} are real numbers and @var{y} is nonzero, return
501 @c @code{@var{x} - @var{y} * floor(@var{x} / @var{y})}. Further for all real
502 @c @var{x}, we have @code{mod (@var{x}, 0) = @var{x}}. For a discussion of the
503 @c definition @code{mod (@var{x}, 0) = @var{x}}, see Section 3.4, of
504 @c "Concrete Mathematics," by Graham, Knuth, and Patashnik. The function
505 @c @code{mod (@var{x}, 1)} is a sawtooth function with period 1 with
506 @c @code{mod (1, 1) = 0} and @code{mod (0, 1) = 0}.
508 Berechnet den Divisionsrest @code{x mod y} des Arguments @var{x} zum Modul @var{y}.
509 @var{x} und @var{y} k@"onnen ganze Zahlen, rationale Zahlen, Gleitkommazahlen
510 oder allgemeine Ausdr@"ucke sein.
512 Sind @var{x} und @var{y} reelle Zahlen und ist @var{y} ungleich Null, gibt
513 @code{mod(@var{x}, @var{y})} das Ergebnis von @code{@var{x} - @var{y} *
514 floor(@var{x} / @var{y})} zur@"uck. Weiterhin gilt f@"ur alle reellen Zahlen
515 @code{mod(@var{x}, 0) = @var{x}}. F@"ur eine Diskussion dieser Definition siehe
516 Kapitel 3.4, "Concrete Mathematics" von Graham, Knuth, and Patashnik. Die
517 Funktion @code{mod(@var{x}, 1)} ist eine S@"agezahnfunktion mit der Periode 1
518 mit @code{mod(1, 1) = 0} und @code{mod(0, 1) = 0}.
520 @c To find the principal argument (a number in the interval @code{(-%pi, %pi]})
521 @c of a complex number, use the function @code{@var{x} |-> %pi - mod (%pi -
522 @c @var{x}, 2*%pi)}, where @var{x} is an argument.
524 Der Hauptwert einer komplexen Zahl, die im Intervall @code{(-%pi, %pi)} liegt,
525 kann mit @code{%pi - mod(%pi - @var{x}, 2*%pi)} bestimmt werden, wobei @var{x}
526 die komplexe Zahl ist.
528 @c When @var{x} and @var{y} are constant expressions (@code{10 * %pi}, for
529 @c example), @code{mod} uses the same big float evaluation scheme that
530 @c @code{floor} and @code{ceiling} uses. Again, it's possible, although
531 @c unlikely, that @code{mod} could return an erroneous value in such cases.
533 Sind @var{x} und @var{y} konstante Ausdr@"ucke, wie zum Beispiel @code{10 * %pi},
534 verwendet @code{mod} dasselbe @mref{bfloat}-Auswertungsschema wie @code{floor}
535 und @code{ceiling}. Diese Umwandlung kann, wenn auch unwahrscheinlich,
538 @c For nonnumerical arguments @var{x} or @var{y}, @code{mod} knows several
539 @c simplification rules:
541 F@"ur nicht numerische Argumente @var{x} oder @var{y} kennt @code{mod}
542 verschiedene Vereinfachungen.
544 Siehe auch die Funktionen @mref{power_mod} und @mrefdot{inv_mod}
548 Zeige f@"ur zwei gro@ss{}e ganze Zahlen, dass f@"ur das modulare Rechnen die
549 Regel @code{mod(a+b, m) = mod(mod(a, m) + mod(b, m), m)} gilt.
552 (%i1) a : random(10^20) + 10^19;
553 (%o1) 72588919020045581148
554 (%i2) b : random(10^20) + 10^19;
555 (%o2) 35463666253140008825
556 (%i3) m : random(10^20) + 10^19;
557 (%o3) 39127433614020247557
559 (%o4) 29797718045145094859
560 (%i5) mod(mod(a, m) + mod(b, m), m);
561 (%o5) 29797718045145094859
564 Vereinfachung f@"ur nicht numerische Argumente.
569 (%i2) mod (a*x, a*y);
576 @c --- 27.11.2010 DK -----------------------------------------------------------
578 @deffn {Funktion} next_prime (@var{n})
580 @c Returns the smallest prime bigger than @var{n}.
582 Gibt die kleinste Primzahl zur@"uck, die der Zahl @var{n} folgt.
585 (%i1) next_prime(27);
590 @c --- 27.03.2012 VN -----------------------------------------------------------
592 @deffn {Funktion} power_mod (@var{a}, @var{n}, @var{m})
594 Verwendet einen modularen Algorithmus, um @code{a^n mod m} zu berechnen.
595 Die Argumente @var{a} und @var{n} m@"ussen ganze Zahlen und der Modul @var{m}
596 eine positive ganze Zahl sein. Ist @var{n} negativ, wird @mref{inv_mod} zur
597 Berechnung des modularen Inversen aufgerufen.
599 @code{power_mod (@var{a}, @var{n}, @var{m})} ist @"aquivalent zu
600 @code{mod(a^n, m)}. Der Algorithmus von @code{power_mod} ist jedoch
601 insbesondere f@"ur gro@ss{}e ganze Zahlen wesentlich effizienter.
603 Siehe auch die Funktionen @mref{inv_mod} und @mrefdot{mod}
607 @code{power_mod(a, n, m)} ist @"aquivalent zu @code{mod(a^n, m}. Das modulare
608 Inverse wird mit der Funktion @code{inv_mod} berechnet.
611 (%i1) power_mod(3, 15, 5);
615 (%i3) power_mod(2, -1, 5);
621 F@"ur gro@ss{}e ganze Zahlen ist @code{power_mod} effizienter. Der folgende
622 Wert kann in keiner vern@"unftigen Zeit mit @code{mod(a^n, m)} berechnet
626 (%i1) power_mod(123456789, 123456789, 987654321);
631 @c --- 27.03.2012 VN -----------------------------------------------------------
633 @deffn {Funktion} primep (@var{n})
635 F@"uhrt einen Primzahltest f@"ur das Argument @var{n} durch. Liefert
636 @code{primep} das Ergebnis @code{false}, ist @var{n} keine Primzahl. Ist das
637 Ergebnis @code{true}, ist @var{n} mit sehr gro@ss{}er Wahrscheinlichkeit eine
640 F@"ur ganze Zahlen @var{n} kleiner als 3317044064679887385961981 wird eine deterministische
641 Variante des Miller-Rabin-Tests angewandt. Hat in diesem Fall @code{primep} den Wert
642 @code{true}, dann ist @var{n} mit Sicherheit eine Primzahl.
644 F@"ur ganze Zahlen @var{n} gr@"o@ss{}er 3317044064679887385961981 f@"uhrt @code{primep}
645 @mref{primep_number_of_tests} Pseudo-Primzahl-Tests nach Miller-Rabin und
646 einen Pseudo-Primzahl-Test nach Lucas durch. Die Wahrscheinlichkeit, dass
647 eine zusammen gesetzte Zahl @var{n} einen Miller-Rabin-Test besteht, ist kleiner
648 als 1/4. Mit dem Standardwert 25 @code{primpe_number_of_tests} sinkt diese
649 Wahrscheinlichkeit damit unter einen Wert von 10^-15.
652 @c --- 23.03.2013 VN -----------------------------------------------------------
653 @anchor{primep_number_of_tests}
654 @defvr {Optionsvariable} primep_number_of_tests
657 @c Number of Miller-Rabin's tests used in @code{primep}.
659 Die Anzahl der Pseudo-Primzahl-Tests nach Miller-Rabin in der Funktion
663 @c --- 13.06.2015 VN -----------------------------------------------------------
665 @deffn {Funktion} primes (@var{start}, @var{end})
667 Gibt eine Liste mit allen Primzahlen von @var{start} bis @var{end} zur@"uck.
675 @c --- 27.11.2010 DK -----------------------------------------------------------
677 @deffn {Funktion} prev_prime (@var{n})
679 @c Returns the greatest prime smaller than @var{n}.
681 Gibt die gr@"o@ss{}te Primzahl zur@"uck, die kleiner als die Zahl @var{n} ist.
684 (%i1) prev_prime(27);
689 @c --- 27.11.2010 DK -----------------------------------------------------------
691 @deffn {Funktion} qunit (@var{n})
693 @c Returns the principal unit of the real quadratic number field
694 @c @code{sqrt (@var{n})} where @var{n} is an integer, i.e., the element whose
695 @c norm is unity. This amounts to solving Pell's equation
696 @c @code{a^2 - @var{n} b^2 = 1}.
698 Findet f@"ur das Argument @var{n} L@"osungen der Pellschen Gleichung
699 @code{a^2 - @var{n} b^2 = 1}.
704 (%i2) expand (% * (sqrt(17) - 4));
709 @c --- 27.03.2012 VN -----------------------------------------------------------
711 @deffn {Funktion} totient (@var{n})
713 Gibt die Anzahl der ganzen Zahlen zur@"uck, die kleiner oder gleich @var{n}
714 und teilerfremd zu @var{n} sind.
717 @c --- 27.03.2012 VN -----------------------------------------------------------
719 @defvr {Optionsvariable} zerobern
720 Standardwert: @code{true}
722 @c When @code{zerobern} is @code{false}, @code{bern} excludes the Bernoulli
723 @c numbers and @code{euler} excludes the Euler numbers which are equal to zero.
724 @c See @code{bern} and @code{euler}.
726 Hat @code{zerobern} den Wert @code{false}, werden von den Funktionen @code{bern}
727 diejenigen Bernoulli-Zahlen und von @code{euler} diejenigen Euler-Zahlen
728 ausgeschlossen, die gleich Null sind. Siehe @mref{bern} und @mrefdot{euler}
731 @c --- 23.03.2013 VN -----------------------------------------------------------
733 @deffn {Funktion} zeta (@var{n})
735 @c Returns the Riemann zeta function. If @var{n} is a negative integer, 0, or a
736 @c positive even integer, the Riemann zeta function simplifies to an exact
737 @c value. For a positive even integer the option variable @code{zeta%pi} has to
738 @c be @code{true} in addition (See @code{zeta%pi}). For a floating point or
739 @c bigfloat number the Riemann zeta function is evaluated numerically. Maxima
740 @c returns a noun form @code{zeta (@var{n})} for all other arguments, including
741 @c rational noninteger, and complex arguments, or for even integers, if
742 @c @code{zeta%pi} has the value @code{false}.
744 Die Riemannsche Zeta-Funktion f@"ur @var{s}, die wie folgt definiert ist:
747 $$\zeta\left(s\right)=\sum_{k=1}^{\infty }{{{1}\over{k^{s}}}}$$
761 F@"ur negative ganze Zahlen @var{n}, Null und positive gerade ganze Zahlen
762 wird @code{zeta} zu einem exakten Ergebnis vereinfacht.
763 Damit diese Vereinfachung f@"ur positive ganze Zahlen ausgef@"uhrt wird,
764 muss die Optionsvariable @code{zeta%pi} den Wert @code{true} haben.
765 Siehe @mref{zeta%pi}. F@"ur einfache und beliebig genaue Gleitkommazahlen
766 (Typ @code{bfloat}) hat @code{zeta} ein numerisches Ergebnis.
767 F@"ur alle anderen Argumente einschlie@ss{}lich der komplexen und
768 rationalen Zahlen gibt @code{zeta} eine Substantivform zur@"uck. Hat die
769 Optionsvariable @code{zeta%pi} den Wert @code{false}, gibt @code{zeta} auch
770 f@"ur gerade ganze Zahlen eine Substantivform zur@"uck.
772 @c @code{zeta(1)} is undefined, but Maxima knows the limit
773 @c @code{limit(zeta(x), x, 1)} from above and below.
775 @code{zeta(1)} ist nicht definiert. Maxima kennt jedoch die einseitigen
776 Grenzwerte @code{limit(zeta(x), x, 1, plus} und
777 @code{limit(zeta(x), x, 1, minus}.
779 @c The Riemann zeta function distributes over lists, matrices, and equations.
781 Die Riemannsche Zeta-Funktion wird auf die Argumente von Listen, Matrizen und
782 Gleichungen angewendet, wenn die Optionsvariable @code{distribute_over}
783 den Wert @code{true} hat.
785 @c See also @code{bfzeta} and @code{zeta%pi}.
787 Siehe auch @mref{bfzeta} und @mrefdot{zeta%pi}
792 (%i1) zeta([-2,-1,0,0.5,2,3,1+%i]);
795 (%o1) [0, - --, - -, - 1.460354508809586, ----, zeta(3),
798 (%i2) limit(zeta(x),x,1,plus);
800 (%i3) limit(zeta(x),x,1,minus);
805 @c --- 27.11.2010 DK -----------------------------------------------------------
807 @defvr {Optionsvariable} zeta%pi
808 Standardwert: @code{true}
810 @c When @code{zeta%pi} is @code{true}, @code{zeta} returns an expression
811 @c proportional to @code{%pi^n} for even integer @code{n}. Otherwise,
812 @c @code{zeta} returns a noun form @code{zeta (n)} for even integer @code{n}.
814 Hat @code{zeta%pi} den Wert @code{true}, vereinfacht die Funktion @code{zeta(n)}
815 f@"ur gerade ganzen Zahlen @var{n} zu einem Ergebnis, das proportional zu
816 @code{%pi^n} ist. Ansonsten ist das Ergebnis von @code{zeta} eine
817 Substantivform f@"ur gerade ganze Zahlen.
828 (%i3) zeta%pi: false$
834 @c --- 27.07.2013 VvN ----------------------------------------------------------
835 @anchor{zn_add_table}
836 @deffn {Funktion} zn_add_table (@var{n})
838 zeigt eine Additionstabelle von allen Elementen in (Z/@var{n}Z).
840 Siehe auch @mref{zn_mult_table}, @mref{zn_power_table}.
843 @c -----------------------------------------------------------------------------
844 @anchor{zn_characteristic_factors}
845 @deffn {Funktion} zn_characteristic_factors (@var{n})
847 Gibt eine Liste mit den charakteristischen Faktoren des Totienten von @var{n} zur@"uck.
849 Mit Hilfe der charakteristischen Faktoren kann eine modulo @var{n} multiplikative Gruppe
850 als direktes Produkt zyklischer Untergruppen dargestellt werden.
852 Ist die Gruppe selbst zyklisch, dann enth@"alt die Liste nur den Totienten
853 und mit @code{zn_primroot} kann ein Generator berechnet werden.
854 Zerf@"allt der Totient in mehrere charakteristische Faktoren,
855 k@"onnen Generatoren der entsprechenden Untergruppen mit @code{zn_factor_generators}
858 Jeder der @code{r} Faktoren in der Liste teilt die weiter rechts stehenden Faktoren.
859 Fuer den letzten Faktor @code{f_r} gilt daher @code{a^f_r = 1 (mod n)}
860 f@"ur alle @code{a} teilerfremd zu @var{n}.
861 Dieser Faktor ist auch als Carmichael Funktion bzw. Carmichael Lambda bekannt.
863 F@"ur @code{n > 2} ist @code{totient(n)/2^r} die Anzahl der quadratischen Reste
864 in der Gruppe und jeder dieser Reste hat @code{2^r} Wurzeln.
866 Siehe auch @mref{totient}, @mref{zn_primroot}, @mref{zn_factor_generators}.
870 Die multiplikative Gruppe modulo @code{14} ist zyklisch und ihre @code{6} Elemente
871 lassen sich durch eine Primitivwurzel erzeugen.
874 (%i1) [zn_characteristic_factors(14), phi: totient(14)];
876 (%i2) [zn_factor_generators(14), g: zn_primroot(14)];
878 (%i3) M14: makelist(power_mod(g,i,14), i,0,phi-1);
879 (%o3) [1, 3, 9, 13, 11, 5]
882 Die multiplikative Gruppe modulo @code{15} ist nicht zyklisch und ihre @code{8} Elemente
883 lassen sich mit Hilfe zweier Faktorgeneratoren erzeugen.
886 (%i1) [[f1,f2]: zn_characteristic_factors(15), totient(15)];
888 (%i2) [[g1,g2]: zn_factor_generators(15), zn_primroot(15)];
889 (%o2) [[11, 7], false]
890 (%i3) UG1: makelist(power_mod(g1,i,15), i,0,f1-1);
892 (%i4) UG2: makelist(power_mod(g2,i,15), i,0,f2-1);
894 (%i5) M15: create_list(mod(i*j,15), i,UG1, j,UG2);
895 (%o5) [1, 7, 4, 13, 11, 2, 14, 8]
898 F@"ur den letzten charakteristischen Faktor @code{4} gilt
899 @code{a^4 = 1 (mod 15)} fuer alle @code{a} in @code{M15}.
901 @code{M15} hat @code{2} charakteristische Faktoren und daher die @code{8/2^2}
902 quadratischen Reste @code{1} und @code{4}, und diese haben jeweils @code{2^2} Wurzeln.
905 (%i6) zn_power_table(15);
921 (%i7) map(lambda([i], zn_nth_root(i,2,15)), [1,4]);
922 (%o7) [[1, 4, 11, 14], [2, 7, 8, 13]]
926 @c -----------------------------------------------------------------------------
927 @anchor{zn_carmichael_lambda}
928 @deffn {Funktion} zn_carmichael_lambda (@var{n})
930 Gibt @code{1} zur@"uck, wenn @var{n} gleich @code{1} ist und andernfalls
931 den gr@"o@ss{}ten charakteristischen Faktor des Totienten von @var{n}.
933 F@"ur Erl@"auterungen und Beispiele siehe @mref{zn_characteristic_factors}.
937 @c --- 27.07.2013 VvN ----------------------------------------------------------
938 @anchor{zn_determinant}
939 @deffn {Funktion} zn_determinant (@var{matrix}, @var{p})
941 verwendet die Technik der LR-Dekomposition, um die Determinante der
942 Matrix @var{matrix} @"uber (Z/@var{p}Z) zu berechnen, wobei @var{p}
943 eine Primzahl sein muss.
945 Ist die Determinante nicht von Null verschieden, kann es sein, dass die
946 LR-Dekomposition nicht m@"oglich ist. @code{zn_determinant} berechnet
947 diesem Fall die Determinante nicht-modular und reduziert im Nachhinein.
949 Siehe auch @mref{zn_invert_by_lu}.
954 (%i1) m : matrix([1,3],[2,4]);
958 (%i2) zn_determinant(m, 5);
960 (%i3) m : matrix([2,4,1],[3,1,4],[4,3,2]);
966 (%i4) zn_determinant(m, 5);
971 @c -----------------------------------------------------------------------------
972 @anchor{zn_factor_generators}
973 @deffn {Funktion} zn_factor_generators (@var{n})
975 Gibt eine Liste mit Faktorgeneratoren zur@"uck, die zu den charakteristischen
976 Faktoren des Totienten von @var{n} passen.
978 F@"ur Erl@"auterungen und Beispiele siehe @mref{zn_characteristic_factors}.
982 @c --- 27.07.2013 VvN ----------------------------------------------------------
983 @anchor{zn_invert_by_lu}
984 @deffn {Funktion} zn_invert_by_lu (@var{matrix}, @var{p})
986 verwendet die Technik der LR-Dekomposition, um ein modulares Inverses der
987 Matrix @var{matrix} @"uber (Z/@var{p}Z) zu berechnen. Voraussetzung ist,
988 dass @var{matrix} invertierbar und @var{p} eine Primzahl ist.
989 Sollte @var{matrix} nicht invertierbar sein, gibt @code{zn_invert_by_lu}
990 @code{false} zur@"ck.
992 Siehe auch @mref{zn_determinant}.
997 (%i1) m : matrix([1,3],[2,4]);
1001 (%i2) zn_determinant(m, 5);
1003 (%i3) mi : zn_invert_by_lu(m, 5);
1007 (%i4) matrixmap(lambda([a], mod(a, 5)), m . mi);
1014 @c --- 03.01.2020 VN -----------------------------------------------------------
1016 @deffn {Funktion} zn_log (@var{a}, @var{g}, @var{n})
1017 @deffnx {Funktion} zn_log (@var{a}, @var{g}, @var{n}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
1019 Berechnet den diskreten Logarithmus. Sei (Z/@var{n}Z)* eine zyklische Gruppe,
1020 @var{g} eine Primitivwurzel modulo @var{n} oder der Generator einer Untergruppe
1021 von (Z/@var{n}Z)* und @var{a} ein Element dieser Gruppe.
1022 Dann berechnet @code{zn_log (a, g, n)} eine L@"osung der Kongruenz
1023 @code{g^x = a mod n}. Man beachte, dass @code{zn_log} nicht terminiert,
1024 falls @var{a} keine Potenz von @var{g} modulo @var{n} ist.
1027 Der verwendete Algorithmus ben@"otigt die Primfaktorzerlegung von @code{zn_order(g)}
1028 bzw. des Totienten von @var{n}.
1029 Da diese Berechnung ebenfalls zeitaufw@"andig ist, kann es eventuell sinnvoll
1030 sein, die Primfaktoren von @code{zn_order(g)} vorab zu berechnen und @code{zn_log} als
1031 viertes Argument zu @"ubergeben. Die Form muss dabei der R@"uckgabe von
1032 @code{ifactors(totient(n))} mit der Standardeinstellung @code{false} der
1033 Optionsvariable @code{factors_only} entsprechen.
1034 Verglichen mit der Laufzeit f@"ur die Berechnung des Logarithmus hat dies jedoch nur
1035 einen recht kleinen Effekt.
1037 Als Algorithmus wird die Pohlig-Hellman-Reduktion und das Rho-Verfahren von
1038 Pollard f@"ur den diskreten Logarithmus verwendet. Die Laufzeit von @code{zn_log}
1039 h@"angt im Wesentlichen von der Bitl@"ange des gr@"o@ss{}ten Primfaktors des
1040 Totienten von @var{n} ab.
1042 Siehe auch @mref{zn_primroot}, @mref{zn_order}, @mref{ifactors}, @mref{totient}.
1046 @code{zn_log (a, g, n)} findet eine L@"osung der Kongruenz @code{g^x = a mod n}.
1050 (%i2) g : zn_primroot(n);
1052 (%i3) ord_7 : zn_order(7, n);
1054 (%i4) powers_7 : makelist(power_mod(g, x, n), x, 0, ord_7 - 1);
1055 (%o4) [1, 7, 5, 13, 3, 21, 15, 17, 9, 19]
1056 (%i5) zn_log(9, g, n);
1058 (%i6) map(lambda([x], zn_log(x, g, n)), powers_7);
1059 (%o6) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1060 (%i7) ord_5 : zn_order(5, n);
1062 (%i8) powers_5 : makelist(power_mod(5,x,n), x, 0, ord_5 - 1);
1063 (%o8) [1, 5, 3, 15, 9]
1064 (%i9) zn_log(9, 5, n);
1068 Das optionale vierte Argument muss der R@"uckgabe von @code{ifactors(totient(n))}
1070 Die Laufzeit h@"angt im Wesentlichen von der Bitl@"ange des gr@"o@ss{}ten
1071 Primfaktors von @code{zn_order(g)} ab.
1074 (%i1) (p : 2^127-1, primep(p));
1076 (%i2) ifs : ifactors(p - 1)$
1077 (%i3) g : zn_primroot(p, ifs);
1079 (%i4) a : power_mod(g, 4711, p)$
1080 (%i5) zn_log(a, g, p, ifs);
1082 (%i6) f_max : last(ifs);
1083 (%o6) [77158673929, 1]
1084 (%i7) ord_5 : zn_order(5,p,ifs)$
1085 (%i8) (p - 1)/ord_5;
1087 (%i9) ifs_5 : ifactors(ord_5)$
1088 (%i10) a : power_mod(5, 4711, p)$
1089 (%i11) zn_log(a, 5, p, ifs_5);
1094 @c -----------------------------------------------------------------------------
1095 @anchor{zn_mult_table}
1096 @deffn {Funktion} zn_mult_table (@var{n})
1097 @deffnx {Funktion} zn_mult_table (@var{n}, @var{gcd})
1099 Ohne das optionale Argument @var{gcd} zeigt @code{zn_mult_table(n)}
1100 eine Multiplikationstabelle von allen Elementen in (Z/@var{n}Z)*,
1101 d.h. von allen zu @var{n} teilerfremden Elementen.
1103 Das optionale zweite Argument @var{gcd} erlaubt es, eine bestimmte Untermenge
1104 von (Z/@var{n}Z) auszuw@"ahlen.
1105 Ist @var{gcd} eine nat@"urliche Zahl, enth@"alt die Multiplikationstabelle
1106 alle Restklassen @code{x} mit @code{gcd(x,n) = }@var{gcd}.
1107 Zur besseren Lesbarkeit werden Zeilen- und Spaltenk@"opfe hinzugef@"ugt.
1108 Falls notwendig, lassen sich diese mit @code{submatrix(1, tabelle, 1)}
1109 wieder einfach entfernen.
1111 Wird @var{gcd} auf @code{all} gesetzt, wird die Tabelle f@"ur s@"amtliche
1112 von Null verschiedene Elemente in (Z/@var{n}Z) ausgegeben.
1114 Das zweite Beispiel unten zeigt einen alternativen Weg, f@"ur Untergruppen
1115 eine Multiplikationstabelle zu erzeugen.
1117 Siehe auch @mref{zn_add_table}, @mref{zn_power_table}.
1121 Die Standardtabelle zeigt alle Elemente aus (Z/@var{n}Z)* und erlaubt,
1122 grundlegende Eigenschaften von modularen Multiplikationsgruppen zu zeigen und
1123 zu studieren. Z.B. stehen in der Hauptdiagonale s@"amtliche quadratische Reste,
1124 jede Zeile und Spalte enth@"alt alle Elemente, die Tabelle ist symmetrisch, etc..
1126 Wird @var{gcd} auf @code{all} gesetzt, wird die Tabelle f@"ur s@"amtliche
1127 von Null verschiedene Elemente in (Z/@var{n}Z) ausgegeben.
1130 (%i1) zn_mult_table(8);
1138 (%i2) zn_mult_table(8, all);
1145 (%o2) [ 4 0 4 0 4 0 4 ]
1154 Ist @var{gcd} eine Zahl, wird zur besseren Lesbarkeit ein Zeilen- und Spaltenkopf
1157 Ist die mit @var{gcd} ausgew@"ahlte Teilmenge eine Gruppe, gibt es einen
1158 alternativen Weg, die Multiplikationstabelle zu erzeugen.
1159 Die Isomorphie zu einer Gruppe mit @code{1} als Identit@"at l@"asst sich nutzen,
1160 um eine leicht lesbare Tabelle zu erhalten. Die Abbildung gelingt mit dem CRT.
1162 In der so erzeugten zweiten Version der Tabelle @code{T36_4} steht genau wie
1163 bei @code{T9} die Identit@"at, hier @code{28}, in der linken oberen Ecke.
1167 (%i1) T36_4: zn_mult_table(36,4);
1168 [ * 4 8 16 20 28 32 ]
1170 [ 4 16 32 28 8 4 20 ]
1172 [ 8 32 28 20 16 8 4 ]
1174 (%o1) [ 16 28 20 4 32 16 8 ]
1176 [ 20 8 16 32 4 20 28 ]
1178 [ 28 4 8 16 20 28 32 ]
1180 [ 32 20 4 8 28 32 16 ]
1181 (%i2) T9: zn_mult_table(36/4);
1193 (%i3) T36_4: matrixmap(lambda([x], chinese([0,x],[4,9])), T9);
1208 @c -----------------------------------------------------------------------------
1209 @anchor{zn_nth_root}
1210 @deffn {Funktion} zn_nth_root (@var{x}, @var{n}, @var{m})
1211 @deffnx {Funktion} zn_nth_root (@var{x}, @var{n}, @var{m}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
1213 Gibt eine Liste mit allen @var{n}-ten Wurzeln von @var{x} aus der multiplikativen
1214 Untergruppe von (Z/@var{m}Z) zur@"uck, in der sich @var{x} befindet,
1215 oder @code{false}, falls @var{x} keine @var{n}-te Potenz modulo @var{m} oder
1216 kein Element einer multiplikativen Untergruppe von (Z/@var{m}Z) ist.
1218 @var{x} ist Element einer multiplikativen Untergruppe modulo @var{m}, wenn der
1219 gr@"o@ss{}te gemeinsame Teiler @code{g = gcd(x,m)} zu @code{m/g} teilerfremd ist.
1221 @code{zn_nth_root} basiert auf einem Algorithmus von Adleman, Manders und Miller
1222 und S@"atzen @"uber modulare Multiplikationsgruppen von Daniel Shanks.
1224 Der Algorithmus ben@"otigt eine Primfaktorzerlegung des Modulus @var{m}.
1225 Es kann eventuell sinnvoll sein, diese Zerlegung vorab zu berechnen und
1226 als viertes Argument zu @"ubergeben. Die Form muss dabei der R@"uckgabe von
1227 @code{ifactors(m)} mit der Standardeinstellung @code{false} der
1228 Optionsvariable @code{factors_only} entsprechen.
1232 Eine Potenztabelle der multiplikativen Gruppe modulo @code{14}
1233 gefolgt von einer Liste mit Listen von @var{n}-ten Wurzeln der @code{1},
1234 wobei @var{n} von @code{1} bis @code{6} variiert.
1237 (%i1) zn_power_table(14);
1249 (%i2) makelist(zn_nth_root(1,n,14), n,1,6);
1250 (%o2) [[1], [1, 13], [1, 9, 11], [1, 13], [1], [1, 3, 5, 9, 11, 13]]
1253 Im folgenden Beispiel ist @var{x} nicht zu @var{m} teilerfremd,
1254 aber es ist Element einer multiplikativen Untergruppe von (Z/@var{m}Z)
1255 und jede @var{n}-te Wurzel ist aus der selben Untergruppe.
1257 Die Restklasse @code{3} ist kein Element in irgend einer multiplikativen
1258 Untergruppe von (Z/63Z) und wird daher nicht als dritte Wurzel von @code{27}
1261 Hier zeigt @code{zn_power_table} alle Reste @code{x} in (Z/63Z)
1262 mit @code{gcd(x,63) = 9}. Diese Untergruppe ist isomorph zu (Z/7Z)*
1263 und seine Identit@"at @code{36} wird mit Hilfe des CRT berechnet.
1268 (%i2) zn_power_table(m,9);
1273 [ 27 36 27 36 27 36 ]
1275 [ 36 36 36 36 36 36 ]
1277 [ 45 9 27 18 54 36 ]
1279 [ 54 18 27 9 45 36 ]
1280 (%i3) zn_nth_root(27,3,m);
1282 (%i4) id7:1$ id63_9: chinese([id7,0],[7,9]);
1286 Im folgenden RSA-@"ahnlichen Beispiel, in dem der Modulus @code{N} quadratfrei ist,
1287 d.h. in paarweise verschiedene Primfaktoren zerf@"allt,
1288 ist jedes @code{x} von @code{0} bis @code{N-1}
1289 in einer multiplikativen Untergruppe enthalten.
1291 Zur Entschl@"usselung wird die @code{e}-te Wurzel berechnet.
1292 @code{e} ist teilerfremd zu @code{N} und die @code{e}-te Wurzel ist deshalb
1293 eindeutig. @code{zn_nth_root} wendet hier effektiv den als CRT-RSA
1294 bekannten Algorithmus an.
1295 (Man beachte, dass @code{flatten} Klammern entfernt und keine L@"osungen.)
1298 (%i1) [p,q,e]: [5,7,17]$ N: p*q$
1300 (%i3) xs: makelist(x,x,0,N-1)$
1302 (%i4) ys: map(lambda([x],power_mod(x,e,N)),xs)$
1304 (%i5) zs: flatten(map(lambda([y], zn_nth_root(y,e,N)), ys))$
1310 Im folgenden Beispiel ist die Faktorisierung des Modulus bekannt und wird
1311 als viertes Argument @"ubergeben.
1314 (%i1) p: 2^107-1$ q: 2^127-1$ N: p*q$
1316 (%i4) ibase: obase: 16$
1318 (%i5) msg: 11223344556677889900aabbccddeeff$
1320 (%i6) enc: power_mod(msg, 10001, N);
1321 (%o6) 1a8db7892ae588bdc2be25dd5107a425001fe9c82161abc673241c8b383
1322 (%i7) zn_nth_root(enc, 10001, N, [[p,1],[q,1]]);
1323 (%o7) [11223344556677889900aabbccddeeff]
1327 @c --- 29.03.2012 VN -----------------------------------------------------------
1329 @deffn {Funktion} zn_order (@var{x}, @var{n})
1330 @deffnx {Funktion} zn_order (@var{x}, @var{n}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
1332 Ist @var{x} eine Einheit in der endlichen Gruppe (Z/@var{n}Z)*, so berechnet
1333 @code{zn_order} die Ordnung dieses Elements. Andernfalls gibt @code{zn_order}
1334 @code{false} zur@"uck. @var{x} ist eine Einheit modulo @var{n}, falls @var{x}
1335 teilerfremd zu @var{n} ist.
1337 Der verwendete Algorithmus ben@"otigt die Primfaktorzerlegung des Totienten von @var{n}.
1338 Da diese Berechnung manchmal recht zeitaufw@"andig ist, kann es eventuell sinnvoll
1339 sein, die Primfaktoren des Totienten vorab zu berechnen und @code{zn_order} als
1340 drittes Argument zu @"ubergeben. Die Form muss dabei der R@"uckgabe von
1341 @code{ifactors(totient(n))} mit der Standardeinstellung @code{false} der
1342 Optionsvariable @code{factors_only} entsprechen.
1344 Siehe auch @mref{zn_primroot}, @mref{ifactors}, @mref{totient}.
1348 @code{zn_order} berechnet die Ordnung einer Einheit @var{x} aus (Z/@var{n}Z)*.
1352 (%i2) g : zn_primroot(n);
1354 (%i3) units_22 : sublist(makelist(i,i,1,21), lambda([x], gcd(x, n) = 1));
1355 (%o3) [1, 3, 5, 7, 9, 13, 15, 17, 19, 21]
1356 (%i4) (ord_7 : zn_order(7, n)) = totient(n);
1358 (%i5) powers_7 : makelist(power_mod(g,i,n), i,0,ord_7 - 1);
1359 (%o5) [1, 7, 5, 13, 3, 21, 15, 17, 9, 19]
1360 (%i6) map(lambda([x], zn_order(x, n)), powers_7);
1361 (%o6) [1, 10, 5, 10, 5, 2, 5, 10, 5, 10]
1362 (%i7) map(lambda([x], ord_7/gcd(x, ord_7)), makelist(i, i,0,ord_7 - 1));
1363 (%o7) [1, 10, 5, 10, 5, 2, 5, 10, 5, 10]
1364 (%i8) totient(totient(n));
1368 Das optionale dritte Argument muss der R@"uckgabe von @code{ifactors(totient(n))}
1372 (%i1) (p : 2^142 + 217, primep(p));
1374 (%i2) ifs : ifactors( totient(p) )$
1375 (%i3) g : zn_primroot(p, ifs);
1377 (%i4) is( (ord_3 : zn_order(g, p, ifs)) = totient(p) );
1379 (%i5) map(lambda([x], ord_3/zn_order(x, p, ifs)), makelist(i,i,2,15));
1380 (%o5) [22, 1, 44, 10, 5, 2, 22, 2, 8, 2, 1, 1, 20, 1]
1384 @c -----------------------------------------------------------------------------
1385 @anchor{zn_power_table}
1386 @deffn {Funktion} zn_power_table (@var{n})
1387 @deffnx {Funktion} zn_power_table (@var{n}, @var{gcd})
1388 @deffnx {Funktion} zn_power_table (@var{n}, @var{gcd}, @var{max_exp})
1390 Ohne ein optionales Argument zeigt @code{zn_power_table(n)}
1391 eine Potenzierungstabelle von allen Elementen in (Z/@var{n}Z)*,
1392 d.h. von allen zu @var{n} teilerfremden Elementen.
1393 Der Exponent variiert dabei jeweils zwischen @code{1} und
1394 dem gr@"o@ss{}ten charakteristischen Faktor des Totienten von @var{n}
1395 (auch bekannt als Carmichael Funktion bzw. Carmichael Lambda),
1396 so dass die Tabelle rechts mit einer Spalte von Einsen endet.
1398 Das optionale zweite Argument @var{gcd} erlaubt es, eine bestimmte Untermenge
1399 von (Z/@var{n}Z) auszuw@"ahlen.
1400 Ist @var{gcd} eine nat@"urliche Zahl, werden Potenzen von allen Restklassen
1401 @code{x} mit @code{gcd(x,n) = }@var{gcd} zur@"uck gegeben,
1402 d.h. @var{gcd} ist standardm@"a@ss{}ig @code{1}.
1403 Wird @var{gcd} auf @code{all} gesetzt, wird die Tabelle f@"ur s@"amtliche
1404 Elemente in (Z/@var{n}Z) ausgegeben.
1406 Wird das optionale dritte Argument @var{max_exp} angegeben, variiert der
1407 Exponent zwischen @code{1} und @var{max_exp}.
1409 Siehe auch @mref{zn_add_table}, @mref{zn_mult_table}.
1413 Die Standardeinstellung @var{gcd}@code{ = 1} erlaubt es, grundlegende S@"atze,
1414 wie die von Fermat and Euler, zu zeigen und zu betrachten.
1416 Das Argument @var{gcd} erlaubt es, bestimmte Teilmengen von (Z/@var{n}Z)
1417 auszuw@"ahlen und multiplikative Untergruppen und Isomorphismen zu untersuchen.
1419 Z.B. sind die Gruppen @code{G10} und @code{G10_2} unter der Multiplikation
1420 beide isomorph zu @code{G5}. @code{1} ist die Identit@"at in @code{G5}.
1421 So sind @code{1} bzw. @code{6} die Identit@"aten in @code{G10} bzw. @code{G10_2}.
1422 Entsprechende Zuordnungen ergeben sich bei den Primitivwurzeln, n-ten Wurzeln, etc..
1425 (%i1) zn_power_table(10);
1433 (%i2) zn_power_table(10,2);
1441 (%i3) zn_power_table(10,5);
1443 (%i4) zn_power_table(10,10);
1445 (%i5) G5: [1,2,3,4];
1447 (%i6) G10_2: map(lambda([x], chinese([0,x],[2,5])), G5);
1449 (%i7) G10: map(lambda([x], power_mod(3, zn_log(x,2,5), 10)), G5);
1453 Wird @var{gcd} auf @code{all} gesetzt, wird die Tabelle f@"ur s@"amtliche
1454 Elemente in (Z/@var{n}Z) ausgegeben.
1456 Das dritte Argument @var{max_exp} erlaubt, den h@"ochsten Exponenten zu w@"ahlen.
1457 Die folgende Tabelle zeigt ein kleines RSA-Beispiel.
1460 (%i1) N:2*5$ phi:totient(N)$ e:7$ d:inv_mod(e,phi)$
1462 (%i5) zn_power_table(N, all, e*d);
1463 [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]
1465 [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ]
1467 [ 2 4 8 6 2 4 8 6 2 4 8 6 2 4 8 6 2 4 8 6 2 ]
1469 [ 3 9 7 1 3 9 7 1 3 9 7 1 3 9 7 1 3 9 7 1 3 ]
1471 [ 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 ]
1473 [ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ]
1475 [ 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 ]
1477 [ 7 9 3 1 7 9 3 1 7 9 3 1 7 9 3 1 7 9 3 1 7 ]
1479 [ 8 4 2 6 8 4 2 6 8 4 2 6 8 4 2 6 8 4 2 6 8 ]
1481 [ 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 1 9 ]
1485 @c --- 29.03.2012 VN -----------------------------------------------------------
1486 @anchor{zn_primroot}
1487 @deffn {Funktion} zn_primroot (@var{n})
1488 @deffnx {Funktion} zn_primroot (@var{n}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
1490 Ist die multiplikative Gruppe (Z/@var{n}Z)* zyklisch, berechnet @code{zn_primroot}
1491 die kleinste Primitivwurzel modulo @var{n}. Dies ist der Fall, wenn @var{n} gleich
1492 @code{2}, @code{4}, @code{p^k} oder @code{2*p^k} ist, wobei @code{p} ungerade und
1493 prim und @code{k} eine nat@"urliche Zahl ist. @code{zn_primroot}
1494 f@"uhrt einen entsprechenden Pr@"atest durch, wenn die Optionsvariable
1495 @mref{zn_primroot_pretest} (Standardwert: @code{false}) @code{true} gesetzt wurde.
1496 In jedem Fall wird die Suche durch die obere Schranke @mref{zn_primroot_limit} begrenzt.
1498 Ist (Z/@var{n}Z)* nicht zyklisch oder kann bis @code{zn_primroot_limit}
1499 keine Primitivwurzel modulo @var{n} gefunden werden, gibt @code{zn_primroot}
1500 @code{false} zur@"uck.
1502 Der verwendete Algorithmus ben@"otigt die Primfaktorzerlegung des Totienten von @var{n}.
1503 Diese Berechnung kann zeitaufw@"andig sein und es kann daher eventuell sinnvoll
1504 sein, die Primfaktoren des Totienten vorab zu berechnen und @code{zn_primroot}
1505 als zus@"atzliches Argument zu @"ubergeben. Die Form muss dabei der R@"uckgabe
1506 von @code{ifactors(totient(n))} mit der Standardeinstellung @code{false} der
1507 Optionsvariable @code{factors_only} entsprechen.
1509 Siehe auch @mref{zn_primroot_p}, @mref{zn_order}, @mref{ifactors}, @mref{totient}.
1513 @code{zn_primroot} berechnet die kleinste Primitivwurzel modulo @var{n} oder gibt
1514 @code{false} zur@"uck.
1518 (%i2) g : zn_primroot(n);
1520 (%i3) zn_order(g, n) = totient(n);
1523 (%i5) zn_primroot(n);
1527 Das optionale zweite Argument muss der R@"uckgabe von @code{ifactors(totient(n))}
1531 (%i1) (p : 2^142 + 217, primep(p));
1533 (%i2) ifs : ifactors( totient(p) )$
1534 (%i3) g : zn_primroot(p, ifs);
1536 (%i4) [time(%o2), time(%o3)];
1537 (%o4) [[15.556972], [0.004]]
1538 (%i5) is(zn_order(g, p, ifs) = p - 1);
1540 (%i6) n : 2^142 + 216$
1541 (%i7) ifs : ifactors(totient(n))$
1542 (%i8) zn_primroot(n, ifs),
1543 zn_primroot_limit : 200, zn_primroot_verbose : true;
1544 `zn_primroot' stopped at zn_primroot_limit = 200
1549 @c --- 23.03.2013 VN -----------------------------------------------------------
1550 @anchor{zn_primroot_limit}
1551 @defvr {Optionsvariable} zn_primroot_limit
1552 Standardwert: @code{1000}
1554 Definiert die obere Schranke f@"ur die Suche von @mref{zn_primroot} nach einer
1555 Primitivwurzel. Wurde die Optionsvariable @mref{zn_primroot_verbose}
1556 (Standardwert: @code{false}) @code{true} gesetzt, wird beim Erreichen von
1557 @code{zn_primroot_limit} ein entsprechender Hinweis ausgegeben.
1560 @c --- 29.03.2012 VN -----------------------------------------------------------
1561 @anchor{zn_primroot_p}
1562 @deffn {Funktion} zn_primroot_p (@var{x}, @var{n})
1563 @deffnx {Funktion} zn_primroot_p (@var{x}, @var{n}, [[@var{p1}, @var{e1}], @dots{}, [@var{pk}, @var{ek}]])
1565 Testet, ob @var{x} eine Primitivwurzel in der multiplikativen Gruppe (Z/@var{n}Z)*
1568 Der verwendete Algorithmus ben@"otigt die Primfaktorzerlegung des Totienten von
1569 @var{n}. Wird dieser Test nacheinander auf mehrere Zahlen angewandt,
1570 kann es sinnvoll sein, die Primfaktoren des Totienten vorab zu berechnen
1571 und @code{zn_primroot_p} als zus@"atzliches drittes Argument zu @"ubergeben.
1572 Die Form muss dabei der R@"uckgabe von @code{ifactors(totient(n))} mit der
1573 Standardeinstellung @code{false} der Optionsvariable @code{factors_only}
1576 Siehe auch @mref{zn_primroot}, @mref{zn_order}, @mref{ifactors}, @mref{totient}.
1580 @code{zn_primroot_p} als Pr@"adikatfunktion.
1584 (%i2) units_14 : sublist(makelist(i,i,1,13), lambda([i], gcd(i, n) = 1));
1585 (%o2) [1, 3, 5, 9, 11, 13]
1586 (%i3) zn_primroot_p(13, n);
1588 (%i4) sublist(units_14, lambda([x], zn_primroot_p(x, n)));
1590 (%i5) map(lambda([x], zn_order(x, n)), units_14);
1591 (%o5) [1, 6, 6, 3, 3, 2]
1594 Das optionale dritte Argument muss der R@"uckgabe von @code{ifactors(totient(n))}
1598 (%i1) (p : 2^142 + 217, primep(p));
1600 (%i2) ifs : ifactors( totient(p) )$
1601 (%i3) sublist(makelist(i,i,1,50), lambda([x], zn_primroot_p(x, p, ifs)));
1602 (%o3) [3, 12, 13, 15, 21, 24, 26, 27, 29, 33, 38, 42, 48]
1603 (%i4) [time(%o2), time(%o3)];
1604 (%o4) [[7.748484], [0.036002]]
1608 @c --- 23.03.2013 VN -----------------------------------------------------------
1609 @anchor{zn_primroot_pretest}
1610 @defvr {Optionsvariable} zn_primroot_pretest
1611 Standardwert: @code{false}
1613 Eine multiplikative Gruppe (Z/@code{n}Z)* ist zyklisch, wenn @code{n} gleich
1614 @code{2}, @code{4}, @code{p^k} oder @code{2*p^k} ist, wobei @code{p} prim und
1615 gr@"o@ss{}er @code{2} und @code{k} eine nat@"urliche Zahl ist.
1617 @code{zn_primroot_pretest} entscheidet dar@"uber, ob @mref{zn_primroot} vor
1618 der Berechnung der kleinsten Primitivwurzel in (Z/@code{n}Z)* @"uberpr@"uft,
1619 ob auf @code{n} @"uberhaupt einer der oben genannten F@"alle zutrifft. Nur wenn
1620 @code{zn_primroot_pretest} @code{true} ist, wird dieser Pr@"atest ausgef@"uhrt.
1623 @c --- 23.03.2013 VN -----------------------------------------------------------
1624 @anchor{zn_primroot_verbose}
1625 @defvr {Optionsvariable} zn_primroot_verbose
1626 Standardwert: @code{false}
1628 Entscheidet, ob @mref{zn_primroot} beim Erreichen von @mref{zn_primroot_limit}
1629 einen Hinweis ausgibt.
1632 @c --- End of file Number.de.texi