gmp 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -62,11 +62,12 @@ typedef __mpf_struct MP_FLOAT;
62
62
  #define mpf_temp_free(var) { mpf_clear(var); free(var); }
63
63
  #define prec_max(prec,var) {if(mpf_get_prec(var) > prec) prec = mpf_get_prec(var); }
64
64
 
65
- #define EXPECTED_ZQFXBD "Expected GMP::Z, GMP::Q, GMP::F, FixNum, BigNum or Float"
66
- #define EXPECTED_ZQFXB "Expected GMP::Z, GMP::Q, GMP::F, FixNum or BigNum"
67
- #define EXPECTED_ZXB "Expected GMP::Z, FixNum or BigNum"
68
- #define EXPECTED_ZX "Expected GMP::Z or FixNum"
69
- #define EXPECTED_X "Expected FixNum"
65
+ #define EXPECTED_ZQFXBD "Expected GMP::Z, GMP::Q, GMP::F, Fixnum, Bignum or Float"
66
+ #define EXPECTED_ZQFXB "Expected GMP::Z, GMP::Q, GMP::F, Fixnum or Bignum"
67
+ #define EXPECTED_ZXB "Expected GMP::Z, Fixnum or Bignum"
68
+ #define EXPECTED_ZX "Expected GMP::Z or Fixnum"
69
+ #define EXPECTED_X "Expected Fixnum"
70
+ #define EXPECTED_Z "Expected GMP::Z"
70
71
  #define typeerror(expected) rb_raise(rb_eTypeError, EXPECTED_##expected)
71
72
  #define typeerror_as(expected, argname) rb_raise(rb_eTypeError, EXPECTED_##expected " as " argname)
72
73
 
@@ -105,6 +106,10 @@ extern VALUE r_gmpz_mul(VALUE self, VALUE arg);
105
106
  extern VALUE r_gmpzsg_pow(VALUE klass, VALUE base, VALUE exp);
106
107
 
107
108
  // Number Theoretic Functions
109
+ extern VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self);
110
+ extern VALUE r_gmpz_jacobi(VALUE self, VALUE b);
111
+ extern VALUE r_gmpzsg_jacobi(VALUE klass, VALUE a, VALUE b);
112
+ extern VALUE r_gmpz_legendre(VALUE self, VALUE p);
108
113
  extern VALUE r_gmpz_remove(VALUE self, VALUE arg);
109
114
 
110
115
  // Integer Comparisons
@@ -114,10 +119,7 @@ extern VALUE r_gmpz_cmpabs(VALUE self, VALUE arg);
114
119
 
115
120
  // _unsorted_
116
121
  extern VALUE r_gmpz_div(VALUE self, VALUE arg);
117
- extern VALUE r_gmpz_is_probab_prime(int argc, VALUE* argv, VALUE self);
118
122
  extern VALUE r_gmpz_popcount(VALUE self);
119
- extern VALUE r_gmpz_jacobi(VALUE self);
120
- extern VALUE r_gmpz_legendre(VALUE self);
121
123
  extern VALUE r_gmpz_setbit(VALUE self, VALUE bitnr, VALUE set_to);
122
124
  extern VALUE r_gmpz_getbit(VALUE self, VALUE bitnr);
123
125
  extern VALUE r_gmpz_scan0(VALUE self, VALUE bitnr);
data/manual.pdf CHANGED
Binary file
data/manual.tex CHANGED
@@ -18,13 +18,15 @@
18
18
  \addtolength{\heavyrulewidth}{\heavyrulewidth}
19
19
  \def\qquad{\quad\quad}
20
20
  \def\qqqquad{\quad\quad\quad\quad}
21
+ \def\cc{\colon\colon}
22
+ \frenchspacing
21
23
  \begin{document}
22
24
 
23
25
  \begin{tabular}{p{1.0in} p{\titrwidth}}
24
26
  \huge{gmp} &\\
25
27
  \midrule[3pt]
26
28
  \multicolumn{2}{r}{\large{Ruby bindings to the GMP library}}\\
27
- \multicolumn{2}{r}{\large{Edition 0.2.1}}\\
29
+ \multicolumn{2}{r}{\large{Edition 0.2.2}}\\
28
30
  \multicolumn{2}{r}{\large{21 December 2009}}
29
31
  \end{tabular}
30
32
 
@@ -164,11 +166,11 @@ There shouldn't be any errors, or warnings.
164
166
  \subsection{Classes}
165
167
  The gmp gem includes the namespace \texttt{GMP} and three classes within \texttt{GMP}:
166
168
  \begin{itemize}
167
- \item \texttt{GMP::Z} - Methods for signed integer arithmetic. There are at least 35
169
+ \item \texttt{GMP::Z} - Methods for signed integer arithmetic. There are at least 45
168
170
  methods here (still accounting).
169
- \item \texttt{GMP::Q} - Methods for rational number arithmetic. There are at least 6
171
+ \item \texttt{GMP::Q} - Methods for rational number arithmetic. There are at least 11
170
172
  methods here (still accounting).
171
- \item \texttt{GMP::F} - Methods for floating-point arithmetic. There are at least 0
173
+ \item \texttt{GMP::F} - Methods for floating-point arithmetic. There are at least 6
172
174
  methods here (still accounting).
173
175
  \end{itemize}
174
176
 
@@ -277,20 +279,8 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
277
279
  \textbf{+} & & \textit{integer} + \textit{numeric} $\rightarrow$ \textit{numeric} \\
278
280
  \cmidrule(r){2-3}
279
281
  & \multicolumn{2}{p{\defnwidth}}{
280
- Returns the sum of \textit{integer} and \textit{numeric}. \textit{numeric} can be a
281
- member of \textit{GMP::Z}, \textit{Fixnum}, \textit{GMP::Q}, \textit{GMP::F}, or
282
- \textit{Bignum}.
283
- }
284
- \end{tabular}
285
- \newline\newline
286
-
287
- \begin{tabular}{p{\methwidth} l r}
288
- \toprule
289
- \textbf{add} & & \textit{integer}.add(\textit{numeric}) $\rightarrow$ \textit{numeric} \\
290
- \cmidrule(r){2-3}
291
- & \multicolumn{2}{p{\defnwidth}}{
292
- Returns the sum of \textit{integer} and \textit{numeric}. \textit{numeric} can be a
293
- member of \textit{GMP::Z}, \textit{Fixnum}, \textit{GMP::Q}, \textit{GMP::F}, or
282
+ Returns the sum of \textit{integer} and \textit{numeric}. \textit{numeric} can be an
283
+ instance of \textit{GMP::Z}, \textit{Fixnum}, \textit{GMP::Q}, \textit{GMP::F}, or
294
284
  \textit{Bignum}.
295
285
  }
296
286
  \end{tabular}
@@ -302,8 +292,8 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
302
292
  \textit{numeric} \\
303
293
  \cmidrule(r){2-3}
304
294
  & \multicolumn{2}{p{\defnwidth}}{
305
- Sums \textit{integer} and \textit{numeric}, in place. \textit{numeric} can be a
306
- member of \textit{GMP::Z}, \textit{Fixnum}, \textit{GMP::Q}, \textit{GMP::F}, or
295
+ Sums \textit{integer} and \textit{numeric}, in place. \textit{numeric} can be an
296
+ instance of \textit{GMP::Z}, \textit{Fixnum}, \textit{GMP::Q}, \textit{GMP::F}, or
307
297
  \textit{Bignum}.
308
298
  }
309
299
  \end{tabular}
@@ -312,12 +302,11 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
312
302
  \begin{tabular}{p{\methwidth} l r}
313
303
  \toprule
314
304
  \textbf{-} & & \textit{integer} - \textit{numeric} $\rightarrow$ \textit{numeric} \\
315
- & & \textit{integer}.sub(\textit{numeric}) $\rightarrow$ \textit{numeric} \\
316
305
  & & \textit{integer}.sub!(\textit{numeric}) $\rightarrow$ \textit{numeric} \\
317
306
  \cmidrule(r){2-3}
318
307
  & \multicolumn{2}{p{\defnwidth}}{
319
308
  Returns the difference of \textit{integer} and \textit{numeric}. The destructive method
320
- calculates the difference in place. \textit{numeric} can be a member of
309
+ calculates the difference in place. \textit{numeric} can be an instance of
321
310
  \textit{GMP::Z}, \textit{Fixnum}, \textit{GMP::Q}, \textit{GMP::F}, or \textit{Bignum}.
322
311
  Here are some examples:\newline
323
312
 
@@ -344,8 +333,19 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
344
333
  \cmidrule(r){2-3}
345
334
  & \multicolumn{2}{p{\defnwidth}}{
346
335
  Returns the product of \textit{integer} and \textit{numeric}. The destructive method
347
- calculates the product in place. \textit{numeric} can be a member of \textit{GMP::Z},
348
- \textit{Fixnum}, \textit{GMP::Q}, \textit{GMP::F}, or \textit{Bignum}.
336
+ calculates the product in place. \textit{numeric} can be an instance of
337
+ \textit{GMP::Z}, \textit{Fixnum}, \textit{GMP::Q}, \textit{GMP::F}, or \textit{Bignum}.
338
+ }
339
+ \end{tabular}
340
+ \newline\newline
341
+
342
+ \begin{tabular}{p{\methwidth} l r}
343
+ \toprule
344
+ \textbf{\textless\textless} & & \textit{integer} \textless\textless \textit{numeric} $\rightarrow$ \textit{integer} \\
345
+ \cmidrule(r){2-3}
346
+ & \multicolumn{2}{p{\defnwidth}}{
347
+ Returns \textit{integer} times 2 to the \textit{numeric} power. This can also be
348
+ defined as a left shift by \textit{numeric} bits.
349
349
  }
350
350
  \end{tabular}
351
351
  \newline\newline
@@ -378,60 +378,57 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
378
378
 
379
379
  \begin{tabular}{p{\methwidth} l r}
380
380
  \toprule
381
- \textbf{tdiv} & & \textit{integer}.tdiv(\textit{numeric}) $\rightarrow$ \textit{integer}\\
381
+ \textbf{tdiv} & & $integer$.tdiv($numeric$) $\rightarrow$ $integer$\\
382
382
  \cmidrule(r){2-3}
383
383
  & \multicolumn{2}{p{\defnwidth}}{
384
- Returns the division of \textit{integer} by \textit{numeric}, truncated.
385
- \textit{numeric} can be a member of \textit{GMP::Z}, \textit{Fixnum}, \textit{Bignum}.
386
- The return object's class is always \textit{GMP::Z}.
384
+ Returns the division of $integer$ by $numeric$, truncated. $numeric$ can be an instance
385
+ of $GMP::Z$, $Fixnum$, $Bignum$. The return object's class is always $GMP::Z$.
387
386
  }
388
387
  \end{tabular}
389
388
  \newline\newline
390
389
 
391
390
  \begin{tabular}{p{\methwidth} l r}
392
391
  \toprule
393
- \textbf{fdiv} & & \textit{integer}.fdiv(\textit{numeric}) $\rightarrow$ \textit{integer}\\
392
+ \textbf{fdiv} & & $integer$.fdiv($numeric$) $\rightarrow$ $integer$\\
394
393
  \cmidrule(r){2-3}
395
394
  & \multicolumn{2}{p{\defnwidth}}{
396
- Returns the division of \textit{integer} by \textit{numeric}, floored.
397
- \textit{numeric} can be a member of \textit{GMP::Z}, \textit{Fixnum}, \textit{Bignum}.
398
- The return object's class is always \textit{GMP::Z}.
395
+ Returns the division of $integer$ by $numeric$, floored. $numeric$ can be an instance
396
+ of $GMP::Z$, $Fixnum$, $Bignum$. The return object's class is always $GMP::Z$.
399
397
  }
400
398
  \end{tabular}
401
399
  \newline\newline
402
400
 
403
401
  \begin{tabular}{p{\methwidth} l r}
404
402
  \toprule
405
- \textbf{cdiv} & & \textit{integer}.cdiv(\textit{numeric}) $\rightarrow$ \textit{integer}\\
403
+ \textbf{cdiv} & & $integer$.cdiv($numeric$) $\rightarrow$ $integer$\\
406
404
  \cmidrule(r){2-3}
407
405
  & \multicolumn{2}{p{\defnwidth}}{
408
- Returns the ceiling division of \textit{integer} by \textit{numeric}.
409
- \textit{numeric} can be a member of \textit{GMP::Z}, \textit{Fixnum}, \textit{Bignum}.
410
- The return object's class is always \textit{GMP::Z}.
406
+ Returns the ceiling division of $integer$ by $numeric$. $numeric$ can be an instance of
407
+ $GMP::Z$, $Fixnum$, $Bignum$. The return object's class is always $GMP::Z$.
411
408
  }
412
409
  \end{tabular}
413
410
  \newline\newline
414
411
 
415
412
  \begin{tabular}{p{\methwidth} l r}
416
413
  \toprule
417
- \textbf{tmod} & & \textit{integer}.tmod(\textit{numeric}) $\rightarrow$ \textit{integer}\\
414
+ \textbf{tmod} & & $integer$.tmod($numeric$) $\rightarrow$ $integer$\\
418
415
  \cmidrule(r){2-3}
419
416
  & \multicolumn{2}{p{\defnwidth}}{
420
- Returns the remainder after truncated division of \textit{integer} by \textit{numeric}.
421
- \textit{numeric} can be a member of \textit{GMP::Z}, \textit{Fixnum}, \textit{Bignum}.
422
- The return object's class is always \textit{GMP::Z}.
417
+ Returns the remainder after truncated division of $integer$ by $numeric$. $numeric$ can
418
+ be an instance of $GMP::Z$, $Fixnum$, $Bignum$. The return object's class is always
419
+ $GMP::Z$.
423
420
  }
424
421
  \end{tabular}
425
422
  \newline\newline
426
423
 
427
424
  \begin{tabular}{p{\methwidth} l r}
428
425
  \toprule
429
- \textbf{fmod} & & \textit{integer}.fmod(\textit{numeric}) $\rightarrow$ \textit{integer}\\
426
+ \textbf{fmod} & & $integer$.fmod($numeric$) $\rightarrow$ $integer$\\
430
427
  \cmidrule(r){2-3}
431
428
  & \multicolumn{2}{p{\defnwidth}}{
432
- Returns the remainder after floored division of \textit{integer} by \textit{numeric}.
433
- \textit{numeric} can be a member of \textit{GMP::Z}, \textit{Fixnum}, \textit{Bignum}.
434
- The return object's class is always \textit{GMP::Z}.
429
+ Returns the remainder after floored division of $integer$ by $numeric$. $numeric$ can
430
+ be an instance of $GMP::Z$, $Fixnum$, $Bignum$. The return object's class is always
431
+ $GMP::Z$.
435
432
  }
436
433
  \end{tabular}
437
434
  \newline\newline
@@ -441,9 +438,9 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
441
438
  \textbf{cmod} & & \textit{integer}.cmod(\textit{numeric}) $\rightarrow$ \textit{integer}\\
442
439
  \cmidrule(r){2-3}
443
440
  & \multicolumn{2}{p{\defnwidth}}{
444
- Returns the remainder after ceilinged division of \textit{integer} by \textit{numeric}.
445
- \textit{numeric} can be a member of \textit{GMP::Z}, \textit{Fixnum}, \textit{Bignum}.
446
- The return object's class is always \textit{GMP::Z}.
441
+ Returns the remainder after ceilinged division of $integer$ by $numeric$. $numeric$ can
442
+ be an instance of $GMP::Z$, $Fixnum$, $Bignum$. The return object's class is always
443
+ $GMP::Z$.
447
444
  }
448
445
  \end{tabular}
449
446
 
@@ -454,7 +451,7 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
454
451
  \textbf{root} & & \textit{integer}.root(\textit{numeric}) $\rightarrow$ \textit{numeric} \\
455
452
  \cmidrule(r){2-3}
456
453
  & \multicolumn{2}{p{\defnwidth}}{
457
- Returns the integer part of the \textit{numeric}'th root of \textit{integer}.
454
+ Returns the integer part of the $numeric$'th root of $integer$.
458
455
  }
459
456
  \end{tabular}
460
457
  \newline\newline
@@ -465,7 +462,7 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
465
462
  & & \textit{integer}.sqrt!(\textit{numeric}) $\rightarrow$ \textit{numeric} \\
466
463
  \cmidrule(r){2-3}
467
464
  & \multicolumn{2}{p{\defnwidth}}{
468
- Returns the truncated integer part of the square root of \textit{integer}.
465
+ Returns the truncated integer part of the square root of $integer$.
469
466
  }
470
467
  \end{tabular}
471
468
  \newline\newline
@@ -475,9 +472,35 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
475
472
  \textbf{sqrtrem} & & \textit{integer}.sqrtrem $\rightarrow$ \textit{sqrt}, \textit{rem} \\
476
473
  \cmidrule(r){2-3}
477
474
  & \multicolumn{2}{p{\defnwidth}}{
478
- Returns the truncated integer part of the square root of \textit{integer} as
479
- \textit{sqrt} and the remainder, \textit{integer - sqrt * sqrt}, as \textit{rem}, which
480
- will be zero if \textit{integer} is a perfect square.
475
+ Returns the truncated integer part of the square root of $integer$ as $sqrt$ and the
476
+ remainder, $integer - sqrt * sqrt$, as $rem$, which will be zero if $integer$ is a
477
+ perfect square.
478
+ }
479
+ \end{tabular}
480
+ \newline\newline
481
+
482
+ \begin{tabular}{p{\methwidth} l r}
483
+ \toprule
484
+ \textbf{power?} & & \textit{integer}.power? $\rightarrow$ \textit{true} \textbar\ \textit{false} \\
485
+ \cmidrule(r){2-3}
486
+ & \multicolumn{2}{p{\defnwidth}}{
487
+ Returns true if $integer$ is a perfect power, i.e., if there exist integers $a$ and
488
+ $b$, with $b > 1$, such that $integer$ equals $a$ raised to the power $b$.
489
+ \newline\newline
490
+ Under this definition both 0 and 1 are considered to be perfect powers. Negative values
491
+ of integers are accepted, but of course can only be odd perfect powers.
492
+ }
493
+ \end{tabular}
494
+ \newline\newline
495
+
496
+ \begin{tabular}{p{\methwidth} l r}
497
+ \toprule
498
+ \textbf{square?} & & \textit{integer}.square? $\rightarrow$ \textit{true} \textbar\ \textit{false} \\
499
+ \cmidrule(r){2-3}
500
+ & \multicolumn{2}{p{\defnwidth}}{
501
+ Returns true if $integer$ is a perfect square, i.e., if the square root of
502
+ $integer$ is an integer. Under this definition both 0 and 1 are considered to be
503
+ perfect squares.
481
504
  }
482
505
  \end{tabular}
483
506
 
@@ -489,7 +512,98 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
489
512
  & & \textit{integer}.pow(\textit{numeric}) $\rightarrow$ \textit{numeric} \\
490
513
  \cmidrule(r){2-3}
491
514
  & \multicolumn{2}{p{\defnwidth}}{
492
- Returns \textit{integer} raised to the \textit{numeric} power.
515
+ Returns $integer$ raised to the $numeric$ power.
516
+ }
517
+ \end{tabular}
518
+ \newline\newline
519
+
520
+ \begin{tabular}{p{\methwidth} l r}
521
+ \toprule
522
+ \textbf{powmod} & & \textit{integer}.powmod(\textit{exp}, \textit{mod}) $\rightarrow$ \textit{integer} \\
523
+ \cmidrule(r){2-3}
524
+ & \multicolumn{2}{p{\defnwidth}}{
525
+ Returns $integer$ raised to the $exp$ power, modulo $mod$. Negative $exp$ is supported
526
+ if an inverse, $integer^{-1}$ modulo $mod$, exists. If an inverse doesn't exist then a
527
+ divide by zero exception is raised.
528
+ }
529
+ \end{tabular}
530
+
531
+ \subsection{Number Theoretic Functions}
532
+
533
+ \begin{tabular}{p{\methwidth} l r}
534
+ \toprule
535
+ \textbf{is\_probab\_prime?} & & $integer$.is\_probab\_prime?($reps = 5$) $\rightarrow$ 0, 1, or 2 \\
536
+ \cmidrule(r){2-3}
537
+ & \multicolumn{2}{p{\defnwidth}}{
538
+ Determine whether $integer$ is prime. Returns 2 if $integer$ is definitely prime,
539
+ returns 1 if $integer$ is probably prime (without being certain), or returns 0 if
540
+ $integer$ is definitely composite.
541
+ \newline\newline
542
+ This function does some trial divisions, then some Miller-Rabin probabilistic primality
543
+ tests. $reps$ controls how many such tests are done, 5 to 10 is a reasonable number,
544
+ more will reduce the chances of a composite being returned as �probably prime�.
545
+ \newline\newline
546
+ Miller-Rabin and similar tests can be more properly called compositeness tests. Numbers
547
+ which fail are known to be composite but those which pass might be prime or might be
548
+ composite. Only a few composites pass, hence those which pass are considered probably
549
+ prime.
550
+ }
551
+ \end{tabular}
552
+ \newline\newline
553
+
554
+ \begin{tabular}{p{\methwidth} l r}
555
+ \toprule
556
+ \textbf{next\_prime} & & $integer$.next\_prime $\rightarrow$ $prime$ \\
557
+ & & $integer$.nextprime $\rightarrow$ $prime$ \\
558
+ & & $integer$.next\_prime! $\rightarrow$ $prime$ \\
559
+ & & $integer$.nextprime! $\rightarrow$ $prime$ \\
560
+ \cmidrule(r){2-3}
561
+ & \multicolumn{2}{p{\defnwidth}}{
562
+ Returns the next prime greater than $integer$. The destructive method sets $integer$ to
563
+ the next prime greater than $integer$.
564
+ \newline\newline
565
+ This function uses a probabilistic algorithm to identify primes. For practical purposes
566
+ it's adequate, the chance of a composite passing will be extremely small.
567
+ }
568
+ \end{tabular}
569
+ \newline\newline
570
+
571
+ \begin{tabular}{p{\methwidth} l r}
572
+ \toprule
573
+ \textbf{jacobi} & & $a$.jacobi($b$) $\rightarrow$ $integer$ \\
574
+ & & GMP::Z.jacobi($a$, $b$) $\rightarrow$ $integer$ \\
575
+ \cmidrule(r){2-3}
576
+ & \multicolumn{2}{p{\defnwidth}}{
577
+ Returns the Jacobi symbol $(a/b)$. This is defined only for $b$ odd. If $b$ is even, a
578
+ range exception will be raised.
579
+ \newline\newline
580
+ $GMP::Z.jacobi$ (the instance method) requires $b$ to be an instance of $GMP::Z$.
581
+ \newline
582
+ $GMP::Z\#jacobi$ (the class method) requires $a$ and $b$ each to be an instance of
583
+ $GMP::Z$, $Fixnum$, or $Bignum$.
584
+ }
585
+ \end{tabular}
586
+ \newline\newline
587
+
588
+ \begin{tabular}{p{\methwidth} l r}
589
+ \toprule
590
+ \textbf{legendre} & & $a$.legendre($b$) $\rightarrow$ $integer$ \\
591
+ \cmidrule(r){2-3}
592
+ & \multicolumn{2}{p{\defnwidth}}{
593
+ Returns the Legendre symbol $(a/b)$. This is defined only for $p$ an odd positive
594
+ prime. If $p$ is even, negative, or composite, a range exception will be raised.
595
+ }
596
+ \end{tabular}
597
+ \newline\newline
598
+
599
+ \begin{tabular}{p{\methwidth} l r}
600
+ \toprule
601
+ \textbf{remove} & & $n$.remove($factor$) $\rightarrow$ ($integer$, $times$) \\
602
+ \cmidrule(r){2-3}
603
+ & \multicolumn{2}{p{\defnwidth}}{
604
+ Remove all occurrences of the factor $factor$ from $n$. $factor$ can be an instance of
605
+ $GMP::Z$, $Fixnum$, or $Bignum$. $integer$ is the resulting integer, an instance of
606
+ $GMP::Z$. $times$ is how many times $factor$ was removed, a $Fixnum$.
493
607
  }
494
608
  \end{tabular}
495
609
 
@@ -29,8 +29,8 @@ Tests:
29
29
  21 mpfr - trigonometry
30
30
  22 mpfr - type tests
31
31
  23 mpfr - sqrt and power
32
+ 24 jacobi, legendre, remove
32
33
  TODO:
33
- jacobi, legendre, remove
34
34
  gcd, lcm
35
35
  cmpabs
36
36
  integer and integer->rational division, modulo
@@ -41,11 +41,11 @@ class TC_fib_fac_nextprime < Test::Unit::TestCase
41
41
  end
42
42
 
43
43
  def test_nextprime
44
- assert_equal(@z11, @z7.nextprime, "GMP::Z.nextprime should work.")
45
- assert_equal(@z11, @z8.nextprime, "GMP::Z.nextprime should work.")
46
- assert_equal(@z11, @z8.nextprime, "GMP::Z.nextprime should work.")
47
- assert_equal(@z13, @z11.nextprime, "GMP::Z.nextprime should work.")
48
- assert_equal(@z17, @z13.nextprime, "GMP::Z.nextprime should work.")
49
- assert_equal(@z19, @z17.nextprime, "GMP::Z.nextprime should work.")
44
+ assert_equal(@z11, @z7.next_prime, "GMP::Z.nextprime should work.")
45
+ assert_equal(@z11, @z8.nextprime, "GMP::Z.nextprime should work.")
46
+ assert_equal(@z11, @z8.next_prime, "GMP::Z.nextprime should work.")
47
+ assert_equal(@z13, @z11.nextprime, "GMP::Z.nextprime should work.")
48
+ assert_equal(@z17, @z13.next_prime, "GMP::Z.nextprime should work.")
49
+ assert_equal(@z19, @z17.nextprime, "GMP::Z.nextprime should work.")
50
50
  end
51
51
  end
@@ -0,0 +1,73 @@
1
+ require 'test_helper'
2
+
3
+ class TC_Z_Jacobi_Legendre_Remove < Test::Unit::TestCase
4
+ def setup
5
+ @one = GMP::Z(1)
6
+ @two = GMP::Z(2)
7
+ @three = GMP::Z(3)
8
+ @four = GMP::Z(4)
9
+ @five = GMP::Z(5)
10
+ @nine = GMP::Z(9)
11
+ @forty_five = GMP::Z(45)
12
+ @neg_one = GMP::Z(-1)
13
+ end
14
+
15
+ # I don't actually know the Jacobi symbol, so these are just from Wolfram Alpha.
16
+ def test_jacobi
17
+ assert_equal(@one.jacobi(@one), 1, "GMP::Z should jacobi(GMP::Z) correctly")
18
+ assert_equal(@two.jacobi(@one), 1, "GMP::Z should jacobi(GMP::Z) correctly")
19
+ assert_equal(@forty_five.jacobi(@one), 1, "GMP::Z should jacobi(GMP::Z) correctly")
20
+ assert_equal(@one.jacobi(@three), 1, "GMP::Z should jacobi(GMP::Z) correctly")
21
+ assert_equal(@two.jacobi(@three), -1, "GMP::Z should jacobi(GMP::Z) correctly")
22
+ assert_equal(@three.jacobi(@three), 0, "GMP::Z should jacobi(GMP::Z) correctly")
23
+ assert_equal(@forty_five.jacobi(@three), 0, "GMP::Z should jacobi(GMP::Z) correctly")
24
+
25
+ assert_equal(GMP::Z.jacobi(@one, @one), 1, "GMP::Z should jacobi(GMP::Z, GMP::Z) correctly")
26
+ assert_equal(GMP::Z.jacobi(@four, @one), 1, "GMP::Z should jacobi(GMP::Z, GMP::Z) correctly")
27
+ assert_equal(GMP::Z.jacobi(@two, @three), -1, "GMP::Z should jacobi(GMP::Z, GMP::Z) correctly")
28
+ assert_equal(GMP::Z.jacobi(@three, @three), 0, "GMP::Z should jacobi(GMP::Z, GMP::Z) correctly")
29
+
30
+ assert_equal(GMP::Z.jacobi(1, @one), 1, "GMP::Z should jacobi(Fixnum, GMP::Z) correctly")
31
+ assert_equal(GMP::Z.jacobi(4, @one), 1, "GMP::Z should jacobi(Fixnum, GMP::Z) correctly")
32
+ assert_equal(GMP::Z.jacobi(2, @three), -1, "GMP::Z should jacobi(Fixnum, GMP::Z) correctly")
33
+ assert_equal(GMP::Z.jacobi(3, @three), 0, "GMP::Z should jacobi(Fixnum, GMP::Z) correctly")
34
+
35
+ assert_equal(GMP::Z.jacobi(@one, 1), 1, "GMP::Z should jacobi(GMP::Z, Fixnum) correctly")
36
+ assert_equal(GMP::Z.jacobi(@four, 1), 1, "GMP::Z should jacobi(GMP::Z, Fixnum) correctly")
37
+ assert_equal(GMP::Z.jacobi(@two, 3), -1, "GMP::Z should jacobi(GMP::Z, Fixnum) correctly")
38
+ assert_equal(GMP::Z.jacobi(@three, 3), 0, "GMP::Z should jacobi(GMP::Z, Fixnum) correctly")
39
+
40
+ assert_equal(GMP::Z.jacobi(1, 1), 1, "GMP::Z should jacobi(Fixnum, Fixnum) correctly")
41
+ assert_equal(GMP::Z.jacobi(4, 1), 1, "GMP::Z should jacobi(Fixnum, Fixnum) correctly")
42
+ assert_equal(GMP::Z.jacobi(2, 3), -1, "GMP::Z should jacobi(Fixnum, Fixnum) correctly")
43
+ assert_equal(GMP::Z.jacobi(3, 3), 0, "GMP::Z should jacobi(Fixnum, Fixnum) correctly")
44
+
45
+ assert_raise(RangeError) { @two.jacobi(@two) }
46
+ assert_raise(RangeError) { @three.jacobi(@neg_one) }
47
+ assert_raise(RangeError) { GMP::Z.jacobi(@two, @two) }
48
+ assert_raise(RangeError) { GMP::Z.jacobi(@three, @neg_one) }
49
+ assert_raise(RangeError) { GMP::Z.jacobi(@two, 2) }
50
+ assert_raise(RangeError) { GMP::Z.jacobi(3, @neg_one) }
51
+ assert_raise(RangeError) { GMP::Z.jacobi(3, -1) }
52
+ end
53
+
54
+ def test_legendre
55
+ assert_equal(@one.legendre(@three), 1, "GMP::Z should legendre(GMP::Z) correctly")
56
+ assert_equal(@two.legendre(@three), -1, "GMP::Z should legendre(GMP::Z) correctly")
57
+
58
+ assert_raise(RangeError) { @one.legendre(@one) }
59
+ assert_raise(RangeError) { @one.legendre(@two) }
60
+ assert_raise(RangeError) { @one.legendre(@neg_one) }
61
+ assert_raise(RangeError) { @one.legendre(@four) }
62
+ assert_raise(RangeError) { @one.legendre(@nine) }
63
+ end
64
+
65
+ def test_remove
66
+ assert_equal(@nine, @forty_five.remove(5)[0], "GMP::Z should remove(GMP::Z) correctly.")
67
+ assert_equal(@nine, @forty_five.remove(@five)[0], "GMP::Z should remove(GMP::Z) correctly.")
68
+ assert_equal(@five, @forty_five.remove(@three)[0], "GMP::Z should remove(GMP::Z) correctly.")
69
+ assert_equal(1, @forty_five.remove(5)[1], "GMP::Z should remove(GMP::Z) correctly.")
70
+ assert_equal(1, @forty_five.remove(@five)[1], "GMP::Z should remove(GMP::Z) correctly.")
71
+ assert_equal(2, @forty_five.remove(@three)[1], "GMP::Z should remove(GMP::Z) correctly.")
72
+ end
73
+ end