comparison lisp/calc/calc-bin.el @ 81717:f81d25630552

(math-bignum-logb-digit-size,math-bignum-digit-power-of-two): New constants. (math-and-bignum,math-or-bignum,math-xor-bignum,math-diff-bignum) (math-not-bignum,math-clip-bignum): Use the constants math-bignum-digit-power-of-two and math-bignum-logb-digit-size instead of their values. (math-clip): Use math-small-integer-size instead of its value.
author Jay Belanger <jay.p.belanger@gmail.com>
date Fri, 06 Jul 2007 02:38:08 +0000
parents 1154f082efd9
children e84fd23f66ff
comparison
equal deleted inserted replaced
81716:66a18d2f078a 81717:f81d25630552
29 29
30 ;; This file is autoloaded from calc-ext.el. 30 ;; This file is autoloaded from calc-ext.el.
31 31
32 (require 'calc-ext) 32 (require 'calc-ext)
33 (require 'calc-macs) 33 (require 'calc-macs)
34
35 ;;; Some useful numbers
36 (defconst math-bignum-logb-digit-size
37 (logb math-bignum-digit-size)
38 "The logb of the size of a bignum digit.
39 This is the largest value of B such that 2^B is less than
40 the size of a Calc bignum digit.")
41
42 (defconst math-bignum-digit-power-of-two
43 (expt 2 math-bignum-logb-digit-size)
44 "The largest power of 2 less than the size of a Calc bignum digit.")
34 45
35 ;;; b-prefix binary commands. 46 ;;; b-prefix binary commands.
36 47
37 (defun calc-and (n) 48 (defun calc-and (n)
38 (interactive "P") 49 (interactive "P")
295 (funcall f a w)) 306 (funcall f a w))
296 mod)))) 307 mod))))
297 308
298 (defun math-and-bignum (a b) ; [l l l] 309 (defun math-and-bignum (a b) ; [l l l]
299 (and a b 310 (and a b
300 (let ((qa (math-div-bignum-digit a 512)) 311 (let ((qa (math-div-bignum-digit a math-bignum-digit-power-of-two))
301 (qb (math-div-bignum-digit b 512))) 312 (qb (math-div-bignum-digit b math-bignum-digit-power-of-two)))
302 (math-mul-bignum-digit (math-and-bignum (math-norm-bignum (car qa)) 313 (math-mul-bignum-digit (math-and-bignum (math-norm-bignum (car qa))
303 (math-norm-bignum (car qb))) 314 (math-norm-bignum (car qb)))
304 512 315 math-bignum-digit-power-of-two
305 (logand (cdr qa) (cdr qb)))))) 316 (logand (cdr qa) (cdr qb))))))
306 317
307 (defun calcFunc-or (a b &optional w) ; [I I I] [Public] 318 (defun calcFunc-or (a b &optional w) ; [I I I] [Public]
308 (cond ((Math-messy-integerp w) 319 (cond ((Math-messy-integerp w)
309 (calcFunc-or a b (math-trunc w))) 320 (calcFunc-or a b (math-trunc w)))
322 (math-binary-arg b w))) 333 (math-binary-arg b w)))
323 w)))) 334 w))))
324 335
325 (defun math-or-bignum (a b) ; [l l l] 336 (defun math-or-bignum (a b) ; [l l l]
326 (and (or a b) 337 (and (or a b)
327 (let ((qa (math-div-bignum-digit a 512)) 338 (let ((qa (math-div-bignum-digit a math-bignum-digit-power-of-two))
328 (qb (math-div-bignum-digit b 512))) 339 (qb (math-div-bignum-digit b math-bignum-digit-power-of-two)))
329 (math-mul-bignum-digit (math-or-bignum (math-norm-bignum (car qa)) 340 (math-mul-bignum-digit (math-or-bignum (math-norm-bignum (car qa))
330 (math-norm-bignum (car qb))) 341 (math-norm-bignum (car qb)))
331 512 342 math-bignum-digit-power-of-two
332 (logior (cdr qa) (cdr qb)))))) 343 (logior (cdr qa) (cdr qb))))))
333 344
334 (defun calcFunc-xor (a b &optional w) ; [I I I] [Public] 345 (defun calcFunc-xor (a b &optional w) ; [I I I] [Public]
335 (cond ((Math-messy-integerp w) 346 (cond ((Math-messy-integerp w)
336 (calcFunc-xor a b (math-trunc w))) 347 (calcFunc-xor a b (math-trunc w)))
349 (math-binary-arg b w))) 360 (math-binary-arg b w)))
350 w)))) 361 w))))
351 362
352 (defun math-xor-bignum (a b) ; [l l l] 363 (defun math-xor-bignum (a b) ; [l l l]
353 (and (or a b) 364 (and (or a b)
354 (let ((qa (math-div-bignum-digit a 512)) 365 (let ((qa (math-div-bignum-digit a math-bignum-digit-power-of-two))
355 (qb (math-div-bignum-digit b 512))) 366 (qb (math-div-bignum-digit b math-bignum-digit-power-of-two)))
356 (math-mul-bignum-digit (math-xor-bignum (math-norm-bignum (car qa)) 367 (math-mul-bignum-digit (math-xor-bignum (math-norm-bignum (car qa))
357 (math-norm-bignum (car qb))) 368 (math-norm-bignum (car qb)))
358 512 369 math-bignum-digit-power-of-two
359 (logxor (cdr qa) (cdr qb)))))) 370 (logxor (cdr qa) (cdr qb))))))
360 371
361 (defun calcFunc-diff (a b &optional w) ; [I I I] [Public] 372 (defun calcFunc-diff (a b &optional w) ; [I I I] [Public]
362 (cond ((Math-messy-integerp w) 373 (cond ((Math-messy-integerp w)
363 (calcFunc-diff a b (math-trunc w))) 374 (calcFunc-diff a b (math-trunc w)))
376 (math-binary-arg b w))) 387 (math-binary-arg b w)))
377 w)))) 388 w))))
378 389
379 (defun math-diff-bignum (a b) ; [l l l] 390 (defun math-diff-bignum (a b) ; [l l l]
380 (and a 391 (and a
381 (let ((qa (math-div-bignum-digit a 512)) 392 (let ((qa (math-div-bignum-digit a math-bignum-digit-power-of-two))
382 (qb (math-div-bignum-digit b 512))) 393 (qb (math-div-bignum-digit b math-bignum-digit-power-of-two)))
383 (math-mul-bignum-digit (math-diff-bignum (math-norm-bignum (car qa)) 394 (math-mul-bignum-digit (math-diff-bignum (math-norm-bignum (car qa))
384 (math-norm-bignum (car qb))) 395 (math-norm-bignum (car qb)))
385 512 396 math-bignum-digit-power-of-two
386 (logand (cdr qa) (lognot (cdr qb))))))) 397 (logand (cdr qa) (lognot (cdr qb)))))))
387 398
388 (defun calcFunc-not (a &optional w) ; [I I] [Public] 399 (defun calcFunc-not (a &optional w) ; [I I] [Public]
389 (cond ((Math-messy-integerp w) 400 (cond ((Math-messy-integerp w)
390 (calcFunc-not a (math-trunc w))) 401 (calcFunc-not a (math-trunc w)))
400 (cons 'bigpos 411 (cons 'bigpos
401 (math-not-bignum (math-binary-arg a w) 412 (math-not-bignum (math-binary-arg a w)
402 w)))))) 413 w))))))
403 414
404 (defun math-not-bignum (a w) ; [l l] 415 (defun math-not-bignum (a w) ; [l l]
405 (let ((q (math-div-bignum-digit a 512))) 416 (let ((q (math-div-bignum-digit a math-bignum-digit-power-of-two)))
406 (if (<= w 9) 417 (if (<= w math-bignum-logb-digit-size)
407 (list (logand (lognot (cdr q)) 418 (list (logand (lognot (cdr q))
408 (1- (lsh 1 w)))) 419 (1- (lsh 1 w))))
409 (math-mul-bignum-digit (math-not-bignum (math-norm-bignum (car q)) 420 (math-mul-bignum-digit (math-not-bignum (math-norm-bignum (car q))
410 (- w 9)) 421 (- w math-bignum-logb-digit-size))
411 512 422 math-bignum-digit-power-of-two
412 (logxor (cdr q) 511))))) 423 (logxor (cdr q)
424 (1- math-bignum-digit-power-of-two))))))
413 425
414 (defun calcFunc-lsh (a &optional n w) ; [I I] [Public] 426 (defun calcFunc-lsh (a &optional n w) ; [I I] [Public]
415 (setq a (math-trunc a) 427 (setq a (math-trunc a)
416 n (if n (math-trunc n) 1)) 428 n (if n (math-trunc n) 1))
417 (if (eq (car-safe a) 'mod) 429 (if (eq (car-safe a) 'mod)
508 (if (Math-natnum-lessp a (math-power-of-2 (- -1 w))) 520 (if (Math-natnum-lessp a (math-power-of-2 (- -1 w)))
509 a 521 a
510 (math-sub a (math-power-of-2 (- w))))) 522 (math-sub a (math-power-of-2 (- w)))))
511 ((Math-negp a) 523 ((Math-negp a)
512 (math-normalize (cons 'bigpos (math-binary-arg a w)))) 524 (math-normalize (cons 'bigpos (math-binary-arg a w))))
513 ((and (integerp a) (< a 1000000)) 525 ((and (integerp a) (< a math-small-integer-size))
514 (if (>= w 20) 526 (if (> w (logb math-small-integer-size))
515 a 527 a
516 (logand a (1- (lsh 1 w))))) 528 (logand a (1- (lsh 1 w)))))
517 (t 529 (t
518 (math-normalize 530 (math-normalize
519 (cons 'bigpos 531 (cons 'bigpos
521 w)))))) 533 w))))))
522 534
523 (defalias 'calcFunc-clip 'math-clip) 535 (defalias 'calcFunc-clip 'math-clip)
524 536
525 (defun math-clip-bignum (a w) ; [l l] 537 (defun math-clip-bignum (a w) ; [l l]
526 (let ((q (math-div-bignum-digit a 512))) 538 (let ((q (math-div-bignum-digit a math-bignum-digit-power-of-two)))
527 (if (<= w 9) 539 (if (<= w math-bignum-logb-digit-size)
528 (list (logand (cdr q) 540 (list (logand (cdr q)
529 (1- (lsh 1 w)))) 541 (1- (lsh 1 w))))
530 (math-mul-bignum-digit (math-clip-bignum (math-norm-bignum (car q)) 542 (math-mul-bignum-digit (math-clip-bignum (math-norm-bignum (car q))
531 (- w 9)) 543 (- w math-bignum-logb-digit-size))
532 512 544 math-bignum-digit-power-of-two
533 (cdr q))))) 545 (cdr q)))))
534 546
535 (defvar math-max-digits-cache nil) 547 (defvar math-max-digits-cache nil)
536 (defun math-compute-max-digits (w r) 548 (defun math-compute-max-digits (w r)
537 (let* ((pair (+ (* r 100000) w)) 549 (let* ((pair (+ (* r 100000) w))