diff options
| author | Mattias EngdegÄrd | 2020-05-15 14:52:50 +0200 |
|---|---|---|
| committer | Mattias EngdegÄrd | 2020-05-15 20:15:36 +0200 |
| commit | 60cd6cce55744e8d3ae844e0602c9dd268dc4bc3 (patch) | |
| tree | 168fe989cb322c487b017f4f4ed293be6a40cb5c | |
| parent | b76cdd0c1a7978decc0c1044ad23ecc9432c526a (diff) | |
| download | emacs-60cd6cce55744e8d3ae844e0602c9dd268dc4bc3.tar.gz emacs-60cd6cce55744e8d3ae844e0602c9dd268dc4bc3.zip | |
Calc: GCD(0,x)=GCD(x,0)=|x|, not x (bug#41279)
Reported by David Ongaro.
* lisp/calc/calc-comb.el (calcFunc-gcd): Fix GCD simplification.
* test/lisp/calc/calc-tests.el (calc-gcd, calc-sum-gcd): New tests.
| -rw-r--r-- | lisp/calc/calc-comb.el | 4 | ||||
| -rw-r--r-- | test/lisp/calc/calc-tests.el | 28 |
2 files changed, 30 insertions, 2 deletions
diff --git a/lisp/calc/calc-comb.el b/lisp/calc/calc-comb.el index d4562a0cc86..c5d4d0837e7 100644 --- a/lisp/calc/calc-comb.el +++ b/lisp/calc/calc-comb.el | |||
| @@ -241,8 +241,8 @@ | |||
| 241 | (calcFunc-gcd (math-neg a) b)) | 241 | (calcFunc-gcd (math-neg a) b)) |
| 242 | ((Math-looks-negp b) | 242 | ((Math-looks-negp b) |
| 243 | (calcFunc-gcd a (math-neg b))) | 243 | (calcFunc-gcd a (math-neg b))) |
| 244 | ((Math-zerop a) b) | 244 | ((Math-zerop a) (math-abs b)) |
| 245 | ((Math-zerop b) a) | 245 | ((Math-zerop b) (math-abs a)) |
| 246 | ((and (Math-ratp a) | 246 | ((and (Math-ratp a) |
| 247 | (Math-ratp b)) | 247 | (Math-ratp b)) |
| 248 | (math-make-frac (math-gcd (if (eq (car-safe a) 'frac) (nth 1 a) a) | 248 | (math-make-frac (math-gcd (if (eq (car-safe a) 'frac) (nth 1 a) a) |
diff --git a/test/lisp/calc/calc-tests.el b/test/lisp/calc/calc-tests.el index 9e36d91ac3e..c8cb97a8bca 100644 --- a/test/lisp/calc/calc-tests.el +++ b/test/lisp/calc/calc-tests.el | |||
| @@ -368,6 +368,34 @@ An existing calc stack is reused, otherwise a new one is created." | |||
| 368 | (vec 0 0 (var a var-a) 0))) | 368 | (vec 0 0 (var a var-a) 0))) |
| 369 | '(neg (var a var-a))))) | 369 | '(neg (var a var-a))))) |
| 370 | 370 | ||
| 371 | (ert-deftest calc-gcd () | ||
| 372 | (should (equal (calcFunc-gcd 3 4) 1)) | ||
| 373 | (should (equal (calcFunc-gcd 12 15) 3)) | ||
| 374 | (should (equal (calcFunc-gcd -12 15) 3)) | ||
| 375 | (should (equal (calcFunc-gcd 12 -15) 3)) | ||
| 376 | (should (equal (calcFunc-gcd -12 -15) 3)) | ||
| 377 | (should (equal (calcFunc-gcd 0 5) 5)) | ||
| 378 | (should (equal (calcFunc-gcd 5 0) 5)) | ||
| 379 | (should (equal (calcFunc-gcd 0 -5) 5)) | ||
| 380 | (should (equal (calcFunc-gcd -5 0) 5)) | ||
| 381 | (should (equal (calcFunc-gcd 0 0) 0)) | ||
| 382 | (should (equal (calcFunc-gcd 0 '(var x var-x)) | ||
| 383 | '(calcFunc-abs (var x var-x)))) | ||
| 384 | (should (equal (calcFunc-gcd '(var x var-x) 0) | ||
| 385 | '(calcFunc-abs (var x var-x))))) | ||
| 386 | |||
| 387 | (ert-deftest calc-sum-gcd () | ||
| 388 | ;; sum(gcd(0,n),n,-1,-1) | ||
| 389 | (should (equal (math-simplify '(calcFunc-sum (calcFunc-gcd 0 (var n var-n)) | ||
| 390 | (var n var-n) -1 -1)) | ||
| 391 | 1)) | ||
| 392 | ;; sum(sum(gcd(n,k),k,-1,1),n,-1,1) | ||
| 393 | (should (equal (math-simplify | ||
| 394 | '(calcFunc-sum | ||
| 395 | (calcFunc-sum (calcFunc-gcd (var n var-n) (var k var-k)) | ||
| 396 | (var k var-k) -1 1) | ||
| 397 | (var n var-n) -1 1)) | ||
| 398 | 8))) | ||
| 371 | 399 | ||
| 372 | (provide 'calc-tests) | 400 | (provide 'calc-tests) |
| 373 | ;;; calc-tests.el ends here | 401 | ;;; calc-tests.el ends here |