| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 |
|
|---|
| 20 |
|
|---|
| 21 |
|
|---|
| 22 |
|
|---|
| 23 |
|
|---|
| 24 |
|
|---|
| 25 |
|
|---|
| 26 |
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 |
|
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 |
(require 'calc-ext) |
|---|
| 33 |
(require 'calc-macs) |
|---|
| 34 |
|
|---|
| 35 |
(defconst math-primes-table |
|---|
| 36 |
[2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 |
|---|
| 37 |
97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 |
|---|
| 38 |
191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 |
|---|
| 39 |
281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 |
|---|
| 40 |
389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 |
|---|
| 41 |
491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 |
|---|
| 42 |
607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 |
|---|
| 43 |
719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 |
|---|
| 44 |
829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 |
|---|
| 45 |
953 967 971 977 983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 |
|---|
| 46 |
1051 1061 1063 1069 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 |
|---|
| 47 |
1153 1163 1171 1181 1187 1193 1201 1213 1217 1223 1229 1231 1237 1249 |
|---|
| 48 |
1259 1277 1279 1283 1289 1291 1297 1301 1303 1307 1319 1321 1327 1361 |
|---|
| 49 |
1367 1373 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451 1453 1459 |
|---|
| 50 |
1471 1481 1483 1487 1489 1493 1499 1511 1523 1531 1543 1549 1553 1559 |
|---|
| 51 |
1567 1571 1579 1583 1597 1601 1607 1609 1613 1619 1621 1627 1637 1657 |
|---|
| 52 |
1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 1741 1747 1753 1759 |
|---|
| 53 |
1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867 1871 1873 1877 |
|---|
| 54 |
1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 1993 1997 |
|---|
| 55 |
1999 2003 2011 2017 2027 2029 2039 2053 2063 2069 2081 2083 2087 2089 |
|---|
| 56 |
2099 2111 2113 2129 2131 2137 2141 2143 2153 2161 2179 2203 2207 2213 |
|---|
| 57 |
2221 2237 2239 2243 2251 2267 2269 2273 2281 2287 2293 2297 2309 2311 |
|---|
| 58 |
2333 2339 2341 2347 2351 2357 2371 2377 2381 2383 2389 2393 2399 2411 |
|---|
| 59 |
2417 2423 2437 2441 2447 2459 2467 2473 2477 2503 2521 2531 2539 2543 |
|---|
| 60 |
2549 2551 2557 2579 2591 2593 2609 2617 2621 2633 2647 2657 2659 2663 |
|---|
| 61 |
2671 2677 2683 2687 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 |
|---|
| 62 |
2749 2753 2767 2777 2789 2791 2797 2801 2803 2819 2833 2837 2843 2851 |
|---|
| 63 |
2857 2861 2879 2887 2897 2903 2909 2917 2927 2939 2953 2957 2963 2969 |
|---|
| 64 |
2971 2999 3001 3011 3019 3023 3037 3041 3049 3061 3067 3079 3083 3089 |
|---|
| 65 |
3109 3119 3121 3137 3163 3167 3169 3181 3187 3191 3203 3209 3217 3221 |
|---|
| 66 |
3229 3251 3253 3257 3259 3271 3299 3301 3307 3313 3319 3323 3329 3331 |
|---|
| 67 |
3343 3347 3359 3361 3371 3373 3389 3391 3407 3413 3433 3449 3457 3461 |
|---|
| 68 |
3463 3467 3469 3491 3499 3511 3517 3527 3529 3533 3539 3541 3547 3557 |
|---|
| 69 |
3559 3571 3581 3583 3593 3607 3613 3617 3623 3631 3637 3643 3659 3671 |
|---|
| 70 |
3673 3677 3691 3697 3701 3709 3719 3727 3733 3739 3761 3767 3769 3779 |
|---|
| 71 |
3793 3797 3803 3821 3823 3833 3847 3851 3853 3863 3877 3881 3889 3907 |
|---|
| 72 |
3911 3917 3919 3923 3929 3931 3943 3947 3967 3989 4001 4003 4007 4013 |
|---|
| 73 |
4019 4021 4027 4049 4051 4057 4073 4079 4091 4093 4099 4111 4127 4129 |
|---|
| 74 |
4133 4139 4153 4157 4159 4177 4201 4211 4217 4219 4229 4231 4241 4243 |
|---|
| 75 |
4253 4259 4261 4271 4273 4283 4289 4297 4327 4337 4339 4349 4357 4363 |
|---|
| 76 |
4373 4391 4397 4409 4421 4423 4441 4447 4451 4457 4463 4481 4483 4493 |
|---|
| 77 |
4507 4513 4517 4519 4523 4547 4549 4561 4567 4583 4591 4597 4603 4621 |
|---|
| 78 |
4637 4639 4643 4649 4651 4657 4663 4673 4679 4691 4703 4721 4723 4729 |
|---|
| 79 |
4733 4751 4759 4783 4787 4789 4793 4799 4801 4813 4817 4831 4861 4871 |
|---|
| 80 |
4877 4889 4903 4909 4919 4931 4933 4937 4943 4951 4957 4967 4969 4973 |
|---|
| 81 |
4987 4993 4999 5003]) |
|---|
| 82 |
|
|---|
| 83 |
|
|---|
| 84 |
|
|---|
| 85 |
|
|---|
| 86 |
(defvar math-prime-factors-finished) |
|---|
| 87 |
|
|---|
| 88 |
|
|---|
| 89 |
|
|---|
| 90 |
(defun calc-gcd (arg) |
|---|
| 91 |
(interactive "P") |
|---|
| 92 |
(calc-slow-wrapper |
|---|
| 93 |
(calc-binary-op "gcd" 'calcFunc-gcd arg))) |
|---|
| 94 |
|
|---|
| 95 |
(defun calc-lcm (arg) |
|---|
| 96 |
(interactive "P") |
|---|
| 97 |
(calc-slow-wrapper |
|---|
| 98 |
(calc-binary-op "lcm" 'calcFunc-lcm arg))) |
|---|
| 99 |
|
|---|
| 100 |
(defun calc-extended-gcd () |
|---|
| 101 |
(interactive) |
|---|
| 102 |
(calc-slow-wrapper |
|---|
| 103 |
(calc-enter-result 2 "egcd" (cons 'calcFunc-egcd (calc-top-list-n 2))))) |
|---|
| 104 |
|
|---|
| 105 |
(defun calc-factorial (arg) |
|---|
| 106 |
(interactive "P") |
|---|
| 107 |
(calc-slow-wrapper |
|---|
| 108 |
(calc-unary-op "fact" 'calcFunc-fact arg))) |
|---|
| 109 |
|
|---|
| 110 |
(defun calc-gamma (arg) |
|---|
| 111 |
(interactive "P") |
|---|
| 112 |
(calc-slow-wrapper |
|---|
| 113 |
(calc-unary-op "gmma" 'calcFunc-gamma arg))) |
|---|
| 114 |
|
|---|
| 115 |
(defun calc-double-factorial (arg) |
|---|
| 116 |
(interactive "P") |
|---|
| 117 |
(calc-slow-wrapper |
|---|
| 118 |
(calc-unary-op "dfac" 'calcFunc-dfact arg))) |
|---|
| 119 |
|
|---|
| 120 |
(defun calc-choose (arg) |
|---|
| 121 |
(interactive "P") |
|---|
| 122 |
(calc-slow-wrapper |
|---|
| 123 |
(if (calc-is-hyperbolic) |
|---|
| 124 |
(calc-binary-op "perm" 'calcFunc-perm arg) |
|---|
| 125 |
(calc-binary-op "chos" 'calcFunc-choose arg)))) |
|---|
| 126 |
|
|---|
| 127 |
(defun calc-perm (arg) |
|---|
| 128 |
(interactive "P") |
|---|
| 129 |
(calc-hyperbolic-func) |
|---|
| 130 |
(calc-choose arg)) |
|---|
| 131 |
|
|---|
| 132 |
(defvar calc-last-random-limit '(float 1 0)) |
|---|
| 133 |
(defun calc-random (n) |
|---|
| 134 |
(interactive "P") |
|---|
| 135 |
(calc-slow-wrapper |
|---|
| 136 |
(if n |
|---|
| 137 |
(calc-enter-result 0 "rand" (list 'calcFunc-random |
|---|
| 138 |
(calc-get-random-limit |
|---|
| 139 |
(prefix-numeric-value n)))) |
|---|
| 140 |
(calc-enter-result 1 "rand" (list 'calcFunc-random |
|---|
| 141 |
(calc-get-random-limit |
|---|
| 142 |
(calc-top-n 1))))))) |
|---|
| 143 |
|
|---|
| 144 |
(defun calc-get-random-limit (val) |
|---|
| 145 |
(if (eq val 0) |
|---|
| 146 |
calc-last-random-limit |
|---|
| 147 |
(setq calc-last-random-limit val))) |
|---|
| 148 |
|
|---|
| 149 |
(defun calc-rrandom () |
|---|
| 150 |
(interactive) |
|---|
| 151 |
(calc-slow-wrapper |
|---|
| 152 |
(setq calc-last-random-limit '(float 1 0)) |
|---|
| 153 |
(calc-enter-result 0 "rand" (list 'calcFunc-random '(float 1 0))))) |
|---|
| 154 |
|
|---|
| 155 |
(defun calc-random-again (arg) |
|---|
| 156 |
(interactive "p") |
|---|
| 157 |
(calc-slow-wrapper |
|---|
| 158 |
(while (>= (setq arg (1- arg)) 0) |
|---|
| 159 |
(calc-enter-result 0 "rand" (list 'calcFunc-random |
|---|
| 160 |
calc-last-random-limit))))) |
|---|
| 161 |
|
|---|
| 162 |
(defun calc-shuffle (n) |
|---|
| 163 |
(interactive "P") |
|---|
| 164 |
(calc-slow-wrapper |
|---|
| 165 |
(if n |
|---|
| 166 |
(calc-enter-result 1 "shuf" (list 'calcFunc-shuffle |
|---|
| 167 |
(prefix-numeric-value n) |
|---|
| 168 |
(calc-get-random-limit |
|---|
| 169 |
(calc-top-n 1)))) |
|---|
| 170 |
(calc-enter-result 2 "shuf" (list 'calcFunc-shuffle |
|---|
| 171 |
(calc-top-n 1) |
|---|
| 172 |
(calc-get-random-limit |
|---|
| 173 |
(calc-top-n 2))))))) |
|---|
| 174 |
|
|---|
| 175 |
(defun calc-report-prime-test (res) |
|---|
| 176 |
(cond ((eq (car res) t) |
|---|
| 177 |
(calc-record-message "prim" "Prime (guaranteed)")) |
|---|
| 178 |
((eq (car res) nil) |
|---|
| 179 |
(if (cdr res) |
|---|
| 180 |
(if (eq (nth 1 res) 'unknown) |
|---|
| 181 |
(calc-record-message |
|---|
| 182 |
"prim" "Non-prime (factors unknown)") |
|---|
| 183 |
(calc-record-message |
|---|
| 184 |
"prim" "Non-prime (%s is a factor)" |
|---|
| 185 |
(math-format-number (nth 1 res)))) |
|---|
| 186 |
(calc-record-message "prim" "Non-prime"))) |
|---|
| 187 |
(t |
|---|
| 188 |
(calc-record-message |
|---|
| 189 |
"prim" "Probably prime (%d iters; %s%% chance of error)" |
|---|
| 190 |
(nth 1 res) |
|---|
| 191 |
(let ((calc-float-format '(fix 2))) |
|---|
| 192 |
(math-format-number (nth 2 res))))))) |
|---|
| 193 |
|
|---|
| 194 |
(defun calc-prime-test (iters) |
|---|
| 195 |
(interactive "p") |
|---|
| 196 |
(calc-slow-wrapper |
|---|
| 197 |
(let* ((n (calc-top-n 1)) |
|---|
| 198 |
(res (math-prime-test n iters))) |
|---|
| 199 |
(calc-report-prime-test res)))) |
|---|
| 200 |
|
|---|
| 201 |
(defvar calc-verbose-nextprime nil) |
|---|
| 202 |
|
|---|
| 203 |
(defun calc-next-prime (iters) |
|---|
| 204 |
(interactive "p") |
|---|
| 205 |
(calc-slow-wrapper |
|---|
| 206 |
(let ((calc-verbose-nextprime t)) |
|---|
| 207 |
(if (calc-is-inverse) |
|---|
| 208 |
(calc-enter-result 1 "prvp" (list 'calcFunc-prevprime |
|---|
| 209 |
(calc-top-n 1) (math-abs iters))) |
|---|
| 210 |
(calc-enter-result 1 "nxtp" (list 'calcFunc-nextprime |
|---|
| 211 |
(calc-top-n 1) (math-abs iters))))))) |
|---|
| 212 |
|
|---|
| 213 |
(defun calc-prev-prime (iters) |
|---|
| 214 |
(interactive "p") |
|---|
| 215 |
(calc-invert-func) |
|---|
| 216 |
(calc-next-prime iters)) |
|---|
| 217 |
|
|---|
| 218 |
(defun calc-prime-factors (iters) |
|---|
| 219 |
(interactive "p") |
|---|
| 220 |
(calc-slow-wrapper |
|---|
| 221 |
(let ((res (calcFunc-prfac (calc-top-n 1)))) |
|---|
| 222 |
(if (not math-prime-factors-finished) |
|---|
| 223 |
(calc-record-message "pfac" "Warning: May not be fully factored")) |
|---|
| 224 |
(calc-enter-result 1 "pfac" res)))) |
|---|
| 225 |
|
|---|
| 226 |
(defun calc-totient (arg) |
|---|
| 227 |
(interactive "P") |
|---|
| 228 |
(calc-slow-wrapper |
|---|
| 229 |
(calc-unary-op "phi" 'calcFunc-totient arg))) |
|---|
| 230 |
|
|---|
| 231 |
(defun calc-moebius (arg) |
|---|
| 232 |
(interactive "P") |
|---|
| 233 |
(calc-slow-wrapper |
|---|
| 234 |
(calc-unary-op "mu" 'calcFunc-moebius arg))) |
|---|
| 235 |
|
|---|
| 236 |
|
|---|
| 237 |
(defun calcFunc-gcd (a b) |
|---|
| 238 |
(if (Math-messy-integerp a) |
|---|
| 239 |
(setq a (math-trunc a))) |
|---|
| 240 |
(if (Math-messy-integerp b) |
|---|
| 241 |
(setq b (math-trunc b))) |
|---|
| 242 |
(cond ((and (Math-integerp a) (Math-integerp b)) |
|---|
| 243 |
(math-gcd a b)) |
|---|
| 244 |
((Math-looks-negp a) |
|---|
| 245 |
(calcFunc-gcd (math-neg a) b)) |
|---|
| 246 |
((Math-looks-negp b) |
|---|
| 247 |
(calcFunc-gcd a (math-neg b))) |
|---|
| 248 |
((Math-zerop a) b) |
|---|
| 249 |
((Math-zerop b) a) |
|---|
| 250 |
((and (Math-ratp a) |
|---|
| 251 |
(Math-ratp b)) |
|---|
| 252 |
(math-make-frac (math-gcd (if (eq (car-safe a) 'frac) (nth 1 a) a) |
|---|
| 253 |
(if (eq (car-safe b) 'frac) (nth 1 b) b)) |
|---|
| 254 |
(calcFunc-lcm |
|---|
| 255 |
(if (eq (car-safe a) 'frac) (nth 2 a) 1) |
|---|
| 256 |
(if (eq (car-safe b) 'frac) (nth 2 b) 1)))) |
|---|
| 257 |
((not (Math-integerp a)) |
|---|
| 258 |
(calc-record-why 'integerp a) |
|---|
| 259 |
(list 'calcFunc-gcd a b)) |
|---|
| 260 |
(t |
|---|
| 261 |
(calc-record-why 'integerp b) |
|---|
| 262 |
(list 'calcFunc-gcd a b)))) |
|---|
| 263 |
|
|---|
| 264 |
(defun calcFunc-lcm (a b) |
|---|
| 265 |
(let ((g (calcFunc-gcd a b))) |
|---|
| 266 |
(if (Math-numberp g) |
|---|
| 267 |
(math-div (math-mul a b) g) |
|---|
| 268 |
(list 'calcFunc-lcm a b)))) |
|---|
| 269 |
|
|---|
| 270 |
(defun calcFunc-egcd (a b) |
|---|
| 271 |
(cond |
|---|
| 272 |
((not (Math-integerp a)) |
|---|
| 273 |
(if (Math-messy-integerp a) |
|---|
| 274 |
(calcFunc-egcd (math-trunc a) b) |
|---|
| 275 |
(calc-record-why 'integerp a) |
|---|
| 276 |
(list 'calcFunc-egcd a b))) |
|---|
| 277 |
((not (Math-integerp b)) |
|---|
| 278 |
(if (Math-messy-integerp b) |
|---|
| 279 |
(calcFunc-egcd a (math-trunc b)) |
|---|
| 280 |
(calc-record-why 'integerp b) |
|---|
| 281 |
(list 'calcFunc-egcd a b))) |
|---|
| 282 |
(t |
|---|
| 283 |
(let ((u1 1) (u2 0) (u3 a) |
|---|
| 284 |
(v1 0) (v2 1) (v3 b) |
|---|
| 285 |
t1 t2 q) |
|---|
| 286 |
(while (not (eq v3 0)) |
|---|
| 287 |
(setq q (math-idivmod u3 v3) |
|---|
| 288 |
t1 (math-sub u1 (math-mul v1 (car q))) |
|---|
| 289 |
t2 (math-sub u2 (math-mul v2 (car q))) |
|---|
| 290 |
u1 v1 u2 v2 u3 v3 |
|---|
| 291 |
v1 t1 v2 t2 v3 (cdr q))) |
|---|
| 292 |
(list 'vec u3 u1 u2))))) |
|---|
| 293 |
|
|---|
| 294 |
|
|---|
| 295 |
|
|---|
| 296 |
|
|---|
| 297 |
(defun calcFunc-fact (n) |
|---|
| 298 |
(let (temp) |
|---|
| 299 |
(cond ((Math-integer-negp n) |
|---|
| 300 |
(if calc-infinite-mode |
|---|
| 301 |
'(var uinf var-uinf) |
|---|
| 302 |
(math-reject-arg n 'range))) |
|---|
| 303 |
((integerp n) |
|---|
| 304 |
(if (<= n 20) |
|---|
| 305 |
(aref '[1 1 2 6 24 120 720 5040 40320 362880 |
|---|
| 306 |
(bigpos 800 628 3) (bigpos 800 916 39) |
|---|
| 307 |
(bigpos 600 1 479) (bigpos 800 20 227 6) |
|---|
| 308 |
(bigpos 200 291 178 87) (bigpos 0 368 674 307 1) |
|---|
| 309 |
(bigpos 0 888 789 922 20) (bigpos 0 96 428 687 355) |
|---|
| 310 |
(bigpos 0 728 705 373 402 6) |
|---|
| 311 |
(bigpos 0 832 408 100 645 121) |
|---|
| 312 |
(bigpos 0 640 176 8 902 432 2)] n) |
|---|
| 313 |
(math-factorial-iter (1- n) 2 1))) |
|---|
| 314 |
((and (math-messy-integerp n) |
|---|
| 315 |
(Math-lessp n 100)) |
|---|
| 316 |
(math-inexact-result) |
|---|
| 317 |
(setq temp (math-trunc n)) |
|---|
| 318 |
(if (>= temp 0) |
|---|
| 319 |
(if (<= temp 20) |
|---|
| 320 |
(math-float (calcFunc-fact temp)) |
|---|
| 321 |
(math-with-extra-prec 1 |
|---|
| 322 |
(math-factorial-iter (1- temp) 2 '(float 1 0)))) |
|---|
| 323 |
(math-reject-arg n 'range))) |
|---|
| 324 |
((math-numberp n) |
|---|
| 325 |
(let* ((q (math-quarter-integer n)) |
|---|
| 326 |
(tn (and q (Math-lessp n 1000) (Math-lessp -1000 n) |
|---|
| 327 |
(1+ (math-floor n))))) |
|---|
| 328 |
(cond ((and tn (= q 2) |
|---|
| 329 |
(or calc-symbolic-mode (< (math-abs tn) 20))) |
|---|
| 330 |
(let ((q (if (< tn 0) |
|---|
| 331 |
(math-div |
|---|
| 332 |
(math-pow -2 (- tn)) |
|---|
| 333 |
(math-double-factorial-iter (* -2 tn) 3 1 2)) |
|---|
| 334 |
(math-div |
|---|
| 335 |
(math-double-factorial-iter (* 2 tn) 3 1 2) |
|---|
| 336 |
(math-pow 2 tn))))) |
|---|
| 337 |
(math-mul q (if calc-symbolic-mode |
|---|
| 338 |
(list 'calcFunc-sqrt '(var pi var-pi)) |
|---|
| 339 |
(math-sqrt-pi))))) |
|---|
| 340 |
((and tn (>= tn 0) (< tn 20) |
|---|
| 341 |
(memq q '(1 3))) |
|---|
| 342 |
(math-inexact-result) |
|---|
| 343 |
(math-div |
|---|
| 344 |
(math-mul (math-double-factorial-iter (* 4 tn) q 1 4) |
|---|
| 345 |
(if (= q 1) (math-gamma-1q) (math-gamma-3q))) |
|---|
| 346 |
(math-pow 4 tn))) |
|---|
| 347 |
(t |
|---|
| 348 |
(math-inexact-result) |
|---|
| 349 |
(math-with-extra-prec 3 |
|---|
| 350 |
(math-gammap1-raw (math-float n))))))) |
|---|
| 351 |
((equal n '(var inf var-inf)) n) |
|---|
| 352 |
(t (calc-record-why 'numberp n) |
|---|
| 353 |
(list 'calcFunc-fact n))))) |
|---|
| 354 |
|
|---|
| 355 |
(math-defcache math-gamma-1q nil |
|---|
| 356 |
(math-with-extra-prec 3 |
|---|
| 357 |
(math-gammap1-raw '(float -75 -2)))) |
|---|
| 358 |
|
|---|
| 359 |
(math-defcache math-gamma-3q nil |
|---|
| 360 |
(math-with-extra-prec 3 |
|---|
| 361 |
(math-gammap1-raw '(float -25 -2)))) |
|---|
| 362 |
|
|---|
| 363 |
(defun math-factorial-iter (count n f) |
|---|
| 364 |
(if (= (% n 5) 1) |
|---|
| 365 |
(math-working (format "factorial(%d)" (1- n)) f)) |
|---|
| 366 |
(if (> count 0) |
|---|
| 367 |
(math-factorial-iter (1- count) (1+ n) (math-mul n f)) |
|---|
| 368 |
f)) |
|---|
| 369 |
|
|---|
| 370 |
(defun calcFunc-dfact (n) |
|---|
| 371 |
(cond ((Math-integer-negp n) |
|---|
| 372 |
(if (math-oddp n) |
|---|
| 373 |
(if (eq n -1) |
|---|
| 374 |
1 |
|---|
| 375 |
(math-div (if (eq (math-mod n 4) 3) 1 -1) |
|---|
| 376 |
(calcFunc-dfact (math-sub -2 n)))) |
|---|
| 377 |
(list 'calcFunc-dfact n))) |
|---|
| 378 |
((Math-zerop n) 1) |
|---|
| 379 |
((integerp n) (math-double-factorial-iter n (+ 2 (% n 2)) 1 2)) |
|---|
| 380 |
((math-messy-integerp n) |
|---|
| 381 |
(let ((temp (math-trunc n))) |
|---|
| 382 |
(math-inexact-result) |
|---|
| 383 |
(if (natnump temp) |
|---|
| 384 |
(if (Math-lessp temp 200) |
|---|
| 385 |
(math-with-extra-prec 1 |
|---|
| 386 |
(math-double-factorial-iter temp (+ 2 (% temp 2)) |
|---|
| 387 |
'(float 1 0) 2)) |
|---|
| 388 |
(let* ((half (math-div2 temp)) |
|---|
| 389 |
(even (math-mul (math-pow 2 half) |
|---|
| 390 |
(calcFunc-fact (math-float half))))) |
|---|
| 391 |
(if (math-evenp temp) |
|---|
| 392 |
even |
|---|
| 393 |
(math-div (calcFunc-fact n) even)))) |
|---|
| 394 |
(list 'calcFunc-dfact n)))) |
|---|
| 395 |
((equal n '(var inf var-inf)) n) |
|---|
| 396 |
(t (calc-record-why 'natnump n) |
|---|
| 397 |
(list 'calcFunc-dfact n)))) |
|---|
| 398 |
|
|---|
| 399 |
(defun math-double-factorial-iter (max n f step) |
|---|
| 400 |
(if (< (% n 12) step) |
|---|
| 401 |
(math-working (format "dfact(%d)" (- n step)) f)) |
|---|
| 402 |
(if (<= n max) |
|---|
| 403 |
(math-double-factorial-iter max (+ n step) (math-mul n f) step) |
|---|
| 404 |
f)) |
|---|
| 405 |
|
|---|
| 406 |
(defun calcFunc-perm (n m) |
|---|
| 407 |
(cond ((and (integerp n) (integerp m) (<= m n) (>= m 0)) |
|---|
| 408 |
(math-factorial-iter m (1+ (- n m)) 1)) |
|---|
| 409 |
((or (not (math-num-integerp n)) |
|---|
| 410 |
(and (math-messy-integerp n) (Math-lessp 100 n)) |
|---|
| 411 |
(not (math-num-integerp m)) |
|---|
| 412 |
(and (math-messy-integerp m) (Math-lessp 100 m))) |
|---|
| 413 |
(or (math-realp n) (equal n '(var inf var-inf)) |
|---|
| 414 |
(math-reject-arg n 'realp)) |
|---|
| 415 |
(or (math-realp m) (equal m '(var inf var-inf)) |
|---|
| 416 |
(math-reject-arg m 'realp)) |
|---|
| 417 |
(and (math-num-integerp n) (math-negp n) (math-reject-arg n 'range)) |
|---|
| 418 |
(and (math-num-integerp m) (math-negp m) (math-reject-arg m 'range)) |
|---|
| 419 |
(math-div (calcFunc-fact n) (calcFunc-fact (math-sub n m)))) |
|---|
| 420 |
(t |
|---|
| 421 |
(let ((tn (math-trunc n)) |
|---|
| 422 |
(tm (math-trunc m))) |
|---|
| 423 |
(math-inexact-result) |
|---|
| 424 |
(or (integerp tn) (math-reject-arg tn 'fixnump)) |
|---|
| 425 |
(or (integerp tm) (math-reject-arg tm 'fixnump)) |
|---|
| 426 |
(or (and (<= tm tn) (>= tm 0)) (math-reject-arg tm 'range)) |
|---|
| 427 |
(math-with-extra-prec 1 |
|---|
| 428 |
(math-factorial-iter tm (1+ (- tn tm)) '(float 1 0))))))) |
|---|
| 429 |
|
|---|
| 430 |
(defun calcFunc-choose (n m) |
|---|
| 431 |
(cond ((and (integerp n) (integerp m) (<= m n) (>= m 0)) |
|---|
| 432 |
(if (> m (/ n 2)) |
|---|
| 433 |
(math-choose-iter (- n m) n 1 1) |
|---|
| 434 |
(math-choose-iter m n 1 1))) |
|---|
| 435 |
((not (math-realp n)) |
|---|
| 436 |
(math-reject-arg n 'realp)) |
|---|
| 437 |
((not (math-realp m)) |
|---|
| 438 |
(math-reject-arg m 'realp)) |
|---|
| 439 |
((not (math-num-integerp m)) |
|---|
| 440 |
(if (and (math-num-integerp n) (math-negp n)) |
|---|
| 441 |
(list 'calcFunc-choose n m) |
|---|
| 442 |
(math-div (calcFunc-fact (math-float n)) |
|---|
| 443 |
(math-mul (calcFunc-fact m) |
|---|
| 444 |
(calcFunc-fact (math-sub n m)))))) |
|---|
| 445 |
((math-negp m) 0) |
|---|
| 446 |
((math-negp n) |
|---|
| 447 |
(let ((val (calcFunc-choose (math-add (math-add n m) -1) m))) |
|---|
| 448 |
(if (math-evenp (math-trunc m)) |
|---|
| 449 |
val |
|---|
| 450 |
(math-neg val)))) |
|---|
| 451 |
((and (math-num-integerp n) |
|---|
| 452 |
(Math-lessp n m)) |
|---|
| 453 |
0) |
|---|
| 454 |
(t |
|---|
| 455 |
(math-inexact-result) |
|---|
| 456 |
(let ((tm (math-trunc m))) |
|---|
| 457 |
(or (integerp tm) (math-reject-arg tm 'fixnump)) |
|---|
| 458 |
(if (> tm 100) |
|---|
| 459 |
(math-div (calcFunc-fact (math-float n)) |
|---|
| 460 |
(math-mul (calcFunc-fact (math-float m)) |
|---|
| 461 |
(calcFunc-fact (math-float |
|---|
| 462 |
(math-sub n m))))) |
|---|
| 463 |
(math-with-extra-prec 1 |
|---|
| 464 |
(math-choose-float-iter tm n 1 1))))))) |
|---|
| 465 |
|
|---|
| 466 |
(defun math-choose-iter (m n i c) |
|---|
| 467 |
(if (and (= (% i 5) 1) (> i 5)) |
|---|
| 468 |
(math-working (format "choose(%d)" (1- i)) c)) |
|---|
| 469 |
(if (<= i m) |
|---|
| 470 |
(math-choose-iter m (1- n) (1+ i) |
|---|
| 471 |
(math-quotient (math-mul c n) i)) |
|---|
| 472 |
c)) |
|---|
| 473 |
|
|---|
| 474 |
(defun math-choose-float-iter (count n i c) |
|---|
| 475 |
(if (= (% i 5) 1) |
|---|
| 476 |
(math-working (format "choose(%d)" (1- i)) c)) |
|---|
| 477 |
(if (> count 0) |
|---|
| 478 |
(math-choose-float-iter (1- count) (math-sub n 1) (1+ i) |
|---|
| 479 |
(math-div (math-mul c n) i)) |
|---|
| 480 |
c)) |
|---|
| 481 |
|
|---|
| 482 |
|
|---|
| 483 |
|
|---|
| 484 |
|
|---|
| 485 |
(defun calcFunc-stir1 (n m) |
|---|
| 486 |
(math-stirling-number n m 1)) |
|---|
| 487 |
|
|---|
| 488 |
(defun calcFunc-stir2 (n m) |
|---|
| 489 |
(math-stirling-number n m 0)) |
|---|
| 490 |
|
|---|
| 491 |
(defvar math-stirling-cache (vector [[1]] [[1]])) |
|---|
| 492 |
|
|---|
| 493 |
|
|---|
| 494 |
|
|---|
| 495 |
|
|---|
| 496 |
(defvar math-stirling-local-cache) |
|---|
| 497 |
|
|---|
| 498 |
(defun math-stirling-number (n m k) |
|---|
| 499 |
(or (math-num-natnump n) (math-reject-arg n 'natnump)) |
|---|
| 500 |
(or (math-num-natnump m) (math-reject-arg m 'natnump)) |
|---|
| 501 |
(if (consp n) (setq n (math-trunc n))) |
|---|
| 502 |
(or (integerp n) (math-reject-arg n 'fixnump)) |
|---|
| 503 |
(if (consp m) (setq m (math-trunc m))) |
|---|
| 504 |
(or (integerp m) (math-reject-arg m 'fixnump)) |
|---|
| 505 |
(if (< n m) |
|---|
| 506 |
0 |
|---|
| 507 |
(let ((math-stirling-local-cache (aref math-stirling-cache k))) |
|---|
| 508 |
(while (<= (length math-stirling-local-cache) n) |
|---|
| 509 |
(let ((i (1- (length math-stirling-local-cache))) |
|---|
| 510 |
row) |
|---|
| 511 |
(setq math-stirling-local-cache |
|---|
| 512 |
(vconcat math-stirling-local-cache |
|---|
| 513 |
(make-vector (length math-stirling-local-cache) nil))) |
|---|
| 514 |
(aset math-stirling-cache k math-stirling-local-cache) |
|---|
| 515 |
(while (< (setq i (1+ i)) (length math-stirling-local-cache)) |
|---|
| 516 |
(aset math-stirling-local-cache i (setq row (make-vector (1+ i) nil))) |
|---|
| 517 |
(aset row 0 0) |
|---|
| 518 |
(aset row i 1)))) |
|---|
| 519 |
(if (= k 1) |
|---|
| 520 |
(math-stirling-1 n m) |
|---|
| 521 |
(math-stirling-2 n m))))) |
|---|
| 522 |
|
|---|
| 523 |
(defun math-stirling-1 (n m) |
|---|
| 524 |
(or (aref (aref math-stirling-local-cache n) m) |
|---|
| 525 |
(aset (aref math-stirling-local-cache n) m |
|---|
| 526 |
(math-add (math-stirling-1 (1- n) (1- m)) |
|---|
| 527 |
(math-mul (- 1 n) (math-stirling-1 (1- n) m)))))) |
|---|
| 528 |
|
|---|
| 529 |
(defun math-stirling-2 (n m) |
|---|
| 530 |
(or (aref (aref math-stirling-local-cache n) m) |
|---|
| 531 |
(aset (aref math-stirling-local-cache n) m |
|---|
| 532 |
(math-add (math-stirling-2 (1- n) (1- m)) |
|---|
| 533 |
(math-mul m (math-stirling-2 (1- n) m)))))) |
|---|
| 534 |
|
|---|
| 535 |
(defvar math-random-table nil) |
|---|
| 536 |
(defvar math-last-RandSeed nil) |
|---|
| 537 |
(defvar math-random-ptr1 nil) |
|---|
| 538 |
(defvar math-random-ptr2 nil) |
|---|
| 539 |
(defvar math-random-shift nil) |
|---|
| 540 |
|
|---|
| 541 |
|
|---|
| 542 |
|
|---|
| 543 |
|
|---|
| 544 |
(defvar var-RandSeed) |
|---|
| 545 |
(defvar math-random-cache nil) |
|---|
| 546 |
(defvar math-gaussian-cache nil) |
|---|
| 547 |
|
|---|
| 548 |
(defun math-init-random-base () |
|---|
| 549 |
(if (and (boundp 'var-RandSeed) var-RandSeed) |
|---|
| 550 |
(if (eq (car-safe var-RandSeed) 'vec) |
|---|
| 551 |
nil |
|---|
| 552 |
(if (Math-integerp var-RandSeed) |
|---|
| 553 |
(let* ((seed (math-sub 161803 var-RandSeed)) |
|---|
| 554 |
(mj (1+ (math-mod seed '(bigpos 0 0 1)))) |
|---|
| 555 |
(mk (1+ (math-mod (math-quotient seed '(bigpos 0 0 1)) |
|---|
| 556 |
'(bigpos 0 0 1)))) |
|---|
| 557 |
(i 0)) |
|---|
| 558 |
(setq math-random-table (cons 'vec (make-list 55 mj))) |
|---|
| 559 |
(while (<= (setq i (1+ i)) 54) |
|---|
| 560 |
(let* ((ii (% (* i 21) 55)) |
|---|
| 561 |
(p (nthcdr ii math-random-table))) |
|---|
| 562 |
(setcar p mk) |
|---|
| 563 |
(setq mk (- mj mk) |
|---|
| 564 |
mj (car p))))) |
|---|
| 565 |
(math-reject-arg var-RandSeed "*RandSeed must be an integer")) |
|---|
| 566 |
(setq var-RandSeed (list 'vec var-RandSeed) |
|---|
| 567 |
math-random-ptr1 math-random-table |
|---|
| 568 |
math-random-cache nil |
|---|
| 569 |
math-random-ptr2 (nthcdr 31 math-random-table)) |
|---|
| 570 |
(let ((i 200)) |
|---|
| 571 |
(while (> (setq i (1- i)) 0) |
|---|
| 572 |
(math-random-base)))) |
|---|
| 573 |
(random t) |
|---|
| 574 |
(setq var-RandSeed nil |
|---|
| 575 |
math-random-cache nil |
|---|
| 576 |
math-random-shift -4) |
|---|
| 577 |
|
|---|
| 578 |
|
|---|
| 579 |
(let ((i 0)) |
|---|
| 580 |
(while (< (setq i (1+ i)) 30) |
|---|
| 581 |
(if (> (lsh (math-abs (random)) math-random-shift) 4095) |
|---|
| 582 |
(setq math-random-shift (1- math-random-shift)))))) |
|---|
| 583 |
(setq math-last-RandSeed var-RandSeed |
|---|
| 584 |
math-gaussian-cache nil)) |
|---|
| 585 |
|
|---|
| 586 |
(defun math-random-base () |
|---|
| 587 |
(if var-RandSeed |
|---|
| 588 |
(progn |
|---|
| 589 |
(setq math-random-ptr1 (or (cdr math-random-ptr1) |
|---|
| 590 |
(cdr math-random-table)) |
|---|
| 591 |
math-random-ptr2 (or (cdr math-random-ptr2) |
|---|
| 592 |
(cdr math-random-table))) |
|---|
| 593 |
(logand (lsh (setcar math-random-ptr1 |
|---|
| 594 |
(logand (- (car math-random-ptr1) |
|---|
| 595 |
(car math-random-ptr2)) 524287)) |
|---|
| 596 |
-6) 1023)) |
|---|
| 597 |
(logand (lsh (random) math-random-shift) 1023))) |
|---|
| 598 |
|
|---|
| 599 |
|
|---|
| 600 |
|
|---|
| 601 |
|
|---|
| 602 |
|
|---|
| 603 |
(defvar math-random-last) |
|---|
| 604 |
(defun math-random-digit () |
|---|
| 605 |
(let (i) |
|---|
| 606 |
(or (and (boundp 'var-RandSeed) (eq var-RandSeed math-last-RandSeed)) |
|---|
| 607 |
(math-init-random-base)) |
|---|
| 608 |
(or math-random-cache |
|---|
| 609 |
(progn |
|---|
| 610 |
(setq math-random-last (math-random-base) |
|---|
| 611 |
math-random-cache (make-vector 13 nil) |
|---|
| 612 |
i -1) |
|---|
| 613 |
(while (< (setq i (1+ i)) 13) |
|---|
| 614 |
(aset math-random-cache i (math-random-base))))) |
|---|
| 615 |
(while (progn |
|---|
| 616 |
(setq i (/ math-random-last 79) |
|---|
| 617 |
math-random-last (aref math-random-cache i)) |
|---|
| 618 |
(aset math-random-cache i (math-random-base)) |
|---|
| 619 |
(>= math-random-last 1000))) |
|---|
| 620 |
math-random-last)) |
|---|
| 621 |
|
|---|
| 622 |
|
|---|
| 623 |
(defun math-random-digits (n) |
|---|
| 624 |
(cond ((<= n 6) |
|---|
| 625 |
(math-scale-right (+ (* (math-random-digit) 1000) (math-random-digit)) |
|---|
| 626 |
(- 6 n))) |
|---|
| 627 |
(t (let* ((slop (% (- 900003 n) 3)) |
|---|
| 628 |
(i (/ (+ n slop) 3)) |
|---|
| 629 |
(digs nil)) |
|---|
| 630 |
(while (> i 0) |
|---|
| 631 |
(setq digs (cons (math-random-digit) digs) |
|---|
| 632 |
i (1- i))) |
|---|
| 633 |
(math-normalize (math-scale-right (cons 'bigpos digs) |
|---|
| 634 |
slop)))))) |
|---|
| 635 |
|
|---|
| 636 |
|
|---|
| 637 |
(defun math-random-float () |
|---|
| 638 |
(math-make-float (math-random-digits calc-internal-prec) |
|---|
| 639 |
(- calc-internal-prec))) |
|---|
| 640 |
|
|---|
| 641 |
|
|---|
| 642 |
(defun math-gaussian-float () |
|---|
| 643 |
(math-with-extra-prec 2 |
|---|
| 644 |
(if (and math-gaussian-cache |
|---|
| 645 |
(= (car math-gaussian-cache) calc-internal-prec)) |
|---|
| 646 |
(prog1 |
|---|
| 647 |
(cdr math-gaussian-cache) |
|---|
| 648 |
(setq math-gaussian-cache nil)) |
|---|
| 649 |
(let* ((v1 (math-add (math-mul (math-random-float) 2) -1)) |
|---|
| 650 |
(v2 (math-add (math-mul (math-random-float) 2) -1)) |
|---|
| 651 |
(r (math-add (math-sqr v1) (math-sqr v2)))) |
|---|
| 652 |
(while (or (not (Math-lessp r 1)) (math-zerop r)) |
|---|
| 653 |
(setq v1 (math-add (math-mul (math-random-float) 2) -1) |
|---|
| 654 |
v2 (math-add (math-mul (math-random-float) 2) -1) |
|---|
| 655 |
r (math-add (math-sqr v1) (math-sqr v2)))) |
|---|
| 656 |
(let ((fac (math-sqrt (math-mul (math-div (calcFunc-ln r) r) -2)))) |
|---|
| 657 |
(setq math-gaussian-cache (cons calc-internal-prec |
|---|
| 658 |
(math-mul v1 fac))) |
|---|
| 659 |
(math-mul v2 fac)))))) |
|---|
| 660 |
|
|---|
| 661 |
|
|---|
| 662 |
(defun calcFunc-random (max) |
|---|
| 663 |
(cond ((Math-zerop max) |
|---|
| 664 |
(math-gaussian-float)) |
|---|
| 665 |
((Math-integerp max) |
|---|
| 666 |
(let* ((digs (math-numdigs max)) |
|---|
| 667 |
(r (math-random-digits (+ digs 3)))) |
|---|
| 668 |
(math-mod r max))) |
|---|
| 669 |
((Math-realp max) |
|---|
| 670 |
(math-mul (math-random-float) max)) |
|---|
| 671 |
((and (eq (car max) 'intv) (math-constp max) |
|---|
| 672 |
(Math-lessp (nth 2 max) (nth 3 max))) |
|---|
| 673 |
(if (math-floatp max) |
|---|
| 674 |
(let ((val (math-add (math-mul (math-random-float) |
|---|
| 675 |
(math-sub (nth 3 max) (nth 2 max))) |
|---|
| 676 |
(nth 2 max)))) |
|---|
| 677 |
(if (or (and (memq (nth 1 max) '(0 1)) |
|---|
| 678 |
(Math-equal val (nth 2 max))) |
|---|
| 679 |
(and (memq (nth 1 max) '(0 2)) |
|---|
| 680 |
(Math-equal val (nth 3 max)))) |
|---|
| 681 |
(calcFunc-random max) |
|---|
| 682 |
val)) |
|---|
| 683 |
(let ((lo (if (memq (nth 1 max) '(0 1)) |
|---|
| 684 |
(math-add (nth 2 max) 1) (nth 2 max))) |
|---|
| 685 |
(hi (if (memq (nth 1 max) '(1 3)) |
|---|
| 686 |
(math-add (nth 3 max) 1) (nth 3 max)))) |
|---|
| 687 |
(if (Math-lessp lo hi) |
|---|
| 688 |
(math-add (calcFunc-random (math-sub hi lo)) lo) |
|---|
| 689 |
(math-reject-arg max "*Empty interval"))))) |
|---|
| 690 |
((eq (car max) 'vec) |
|---|
| 691 |
(if (cdr max) |
|---|
| 692 |
(nth (1+ (calcFunc-random (1- (length max)))) max) |
|---|
| 693 |
(math-reject-arg max "*Empty list"))) |
|---|
| 694 |
((and (eq (car max) 'sdev) (math-constp max) (Math-realp (nth 1 max))) |
|---|
| 695 |
(math-add (math-mul (math-gaussian-float) (nth 2 max)) (nth 1 max))) |
|---|
| 696 |
(t (math-reject-arg max 'realp)))) |
|---|
| 697 |
|
|---|
| 698 |
|
|---|
| 699 |
(defun calcFunc-shuffle (n &optional max) |
|---|
| 700 |
(or max (setq max n n -1)) |
|---|
| 701 |
(or (and (Math-num-integerp n) |
|---|
| 702 |
(or (natnump (setq n (math-trunc n))) (eq n -1))) |
|---|
| 703 |
(math-reject-arg n 'integerp)) |
|---|
| 704 |
(cond ((or (math-zerop max) |
|---|
| 705 |
(math-floatp max) |
|---|
| 706 |
(eq (car-safe max) 'sdev)) |
|---|
| 707 |
(if (< n 0) |
|---|
| 708 |
(math-reject-arg n 'natnump) |
|---|
| 709 |
(math-simple-shuffle n max))) |
|---|
| 710 |
((and (<= n 1) (>= n 0)) |
|---|
| 711 |
(math-simple-shuffle n max)) |
|---|
| 712 |
((and (eq (car-safe max) 'intv) (math-constp max)) |
|---|
| 713 |
(let ((num (math-add (math-sub (nth 3 max) (nth 2 max)) |
|---|
| 714 |
(cdr (assq (nth 1 max) |
|---|
| 715 |
'((0 . -1) (1 . 0) |
|---|
| 716 |
(2 . 0) (3 . 1)))))) |
|---|
| 717 |
(min (math-add (nth 2 max) (if (memq (nth 1 max) '(0 1)) |
|---|
| 718 |
1 0)))) |
|---|
| 719 |
(if (< n 0) (setq n num)) |
|---|
| 720 |
(or (math-posp num) (math-reject-arg max 'range)) |
|---|
| 721 |
(and (Math-lessp num n) (math-reject-arg n 'range)) |
|---|
| 722 |
(if (Math-lessp n (math-quotient num 3)) |
|---|
| 723 |
(math-simple-shuffle n max) |
|---|
| 724 |
(if (> (* n 4) (* num 3)) |
|---|
| 725 |
(math-add (math-sub min 1) |
|---|
| 726 |
(math-shuffle-list n num (calcFunc-index num))) |
|---|
| 727 |
(let ((tot 0) |
|---|
| 728 |
(m 0) |
|---|
| 729 |
(vec nil)) |
|---|
| 730 |
(while (< m n) |
|---|
| 731 |
(if (< (calcFunc-random (- num tot)) (- n m)) |
|---|
| 732 |
(setq vec (cons (math-add min tot) vec) |
|---|
| 733 |
m (1+ m))) |
|---|
| 734 |
(setq tot (1+ tot))) |
|---|
| 735 |
(math-shuffle-list n n (cons 'vec vec))))))) |
|---|
| 736 |
((eq (car-safe max) 'vec) |
|---|
| 737 |
(let ((size (1- (length max)))) |
|---|
| 738 |
(if (< n 0) (setq n size)) |
|---|
| 739 |
(if (and (> n (/ size 2)) (<= n size)) |
|---|
| 740 |
(math-shuffle-list n size (copy-sequence max)) |
|---|
| 741 |
(let* ((vals (calcFunc-shuffle |
|---|
| 742 |
n (list 'intv 3 1 (1- (length max))))) |
|---|
| 743 |
(p vals)) |
|---|
| 744 |
(while (setq p (cdr p)) |
|---|
| 745 |
(setcar p (nth (car p) max))) |
|---|
| 746 |
vals)))) |
|---|
| 747 |
((math-integerp max) |
|---|
| 748 |
(if (math-posp max) |
|---|
| 749 |
(calcFunc-shuffle n (list 'intv 2 0 max)) |
|---|
| 750 |
(calcFunc-shuffle n (list 'intv 1 max 0)))) |
|---|
| 751 |
(t (math-reject-arg max 'realp)))) |
|---|
| 752 |
|
|---|
| 753 |
(defun math-simple-shuffle (n max) |
|---|
| 754 |
(let ((vec nil) |
|---|
| 755 |
val) |
|---|
| 756 |
(while (>= (setq n (1- n)) 0) |
|---|
| 757 |
(while (math-member (setq val (calcFunc-random max)) vec)) |
|---|
| 758 |
(setq vec (cons val vec))) |
|---|
| 759 |
(cons 'vec vec))) |
|---|
| 760 |
|
|---|
| 761 |
(defun math-shuffle-list (n size vec) |
|---|
| 762 |
(let ((j size) |
|---|
| 763 |
k temp |
|---|
| 764 |
(p vec)) |
|---|
| 765 |
(while (cdr (setq p (cdr p))) |
|---|
| 766 |
(setq k (calcFunc-random j) |
|---|
| 767 |
j (1- j) |
|---|
| 768 |
temp (nth k p)) |
|---|
| 769 |
(setcar (nthcdr k p) (car p)) |
|---|
| 770 |
(setcar p temp)) |
|---|
| 771 |
(cons 'vec (nthcdr (- size n -1) vec)))) |
|---|
| 772 |
|
|---|
| 773 |
(defun math-member (x list) |
|---|
| 774 |
(while (and list (not (equal x (car list)))) |
|---|
| 775 |
(setq list (cdr list))) |
|---|
| 776 |
list) |
|---|
| 777 |
|
|---|
| 778 |
|
|---|
| 779 |
|
|---|
| 780 |
|
|---|
| 781 |
|
|---|
| 782 |
|
|---|
| 783 |
|
|---|
| 784 |
|
|---|
| 785 |
(defvar math-prime-test-cache '(-1)) |
|---|
| 786 |
|
|---|
| 787 |
(defvar math-prime-test-cache-k) |
|---|
| 788 |
(defvar math-prime-test-cache-q) |
|---|
| 789 |
(defvar math-prime-test-cache-nm1) |
|---|
| 790 |
|
|---|
| 791 |
(defun math-prime-test (n iters) |
|---|
| 792 |
(if (and (Math-vectorp n) (cdr n)) |
|---|
| 793 |
(setq n (nth (1- (length n)) n))) |
|---|
| 794 |
(if (Math-messy-integerp n) |
|---|
| 795 |
(setq n (math-trunc n))) |
|---|
| 796 |
(let ((res)) |
|---|
| 797 |
(while (> iters 0) |
|---|
| 798 |
(setq res |
|---|
| 799 |
(cond ((and (integerp n) (<= n 5003)) |
|---|
| 800 |
(list (= (math-next-small-prime n) n))) |
|---|
| 801 |
((not (Math-integerp n)) |
|---|
| 802 |
(error "Argument must be an integer")) |
|---|
| 803 |
((Math-integer-negp n) |
|---|
| 804 |
'(nil)) |
|---|
| 805 |
((Math-natnum-lessp n '(bigpos 0 0 8)) |
|---|
| 806 |
(setq n (math-fixnum n)) |
|---|
| 807 |
(let ((i -1) v) |
|---|
| 808 |
(while (and (> (% n (setq v (aref math-primes-table |
|---|
| 809 |
(setq i (1+ i))))) |
|---|
| 810 |
0) |
|---|
| 811 |
(< (* v v) n))) |
|---|
| 812 |
(if (= (% n v) 0) |
|---|
| 813 |
(list nil v) |
|---|
| 814 |
'(t)))) |
|---|
| 815 |
((not (equal n (car math-prime-test-cache))) |
|---|
| 816 |
(cond ((= (% (nth 1 n) 2) 0) '(nil 2)) |
|---|
| 817 |
((= (% (nth 1 n) 5) 0) '(nil 5)) |
|---|
| 818 |
(t (let ((dig (cdr n)) (sum 0)) |
|---|
| 819 |
(while dig |
|---|
| 820 |
(if (cdr dig) |
|---|
| 821 |
(setq sum (% (+ (+ sum (car dig)) |
|---|
| 822 |
(* (nth 1 dig) 1000)) |
|---|
| 823 |
111111) |
|---|
| 824 |
dig (cdr (cdr dig))) |
|---|
| 825 |
(setq sum (% (+ sum (car dig)) 111111) |
|---|
| 826 |
dig nil))) |
|---|
| 827 |
(cond ((= (% sum 3) 0) '(nil 3)) |
|---|
| 828 |
((= (% sum 7) 0) '(nil 7)) |
|---|
| 829 |
((= (% sum 11) 0) '(nil 11)) |
|---|
| 830 |
((= (% sum 13) 0) '(nil 13)) |
|---|
| 831 |
((= (% sum 37) 0) '(nil 37)) |
|---|
| 832 |
(t |
|---|
| 833 |
(setq math-prime-test-cache-k 1 |
|---|
| 834 |
math-prime-test-cache-q |
|---|
| 835 |
|
|---|