| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // -*-C-*-
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // $Id: s48_bignumint.h,v 1.14 2005/12/21 02:36:52 spestov Exp $
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // Copyright (c) 1989-1992 Massachusetts Institute of Technology
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // This material was developed by the Scheme project at the Massachusetts
 | 
					
						
							|  |  |  | // Institute of Technology, Department of Electrical Engineering and
 | 
					
						
							|  |  |  | // Computer Science.  Permission to copy and modify this software, to
 | 
					
						
							|  |  |  | // redistribute either the original software or a modified version, and
 | 
					
						
							|  |  |  | // to use this software for any purpose is granted, subject to the
 | 
					
						
							|  |  |  | // following restrictions and understandings.
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // 1. Any copy made of this software must include this copyright notice
 | 
					
						
							|  |  |  | // in full.
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // 2. Users of this software agree to make their best efforts (a) to
 | 
					
						
							|  |  |  | // return to the MIT Scheme project any improvements or extensions that
 | 
					
						
							|  |  |  | // they make, so that these may be included in future releases; and (b)
 | 
					
						
							|  |  |  | // to inform MIT of noteworthy uses of this software.
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // 3. All materials developed as a consequence of the use of this
 | 
					
						
							|  |  |  | // software shall duly acknowledge such use, in accordance with the usual
 | 
					
						
							|  |  |  | // standards of acknowledging credit in academic research.
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // 4. MIT has made no warrantee or representation that the operation of
 | 
					
						
							|  |  |  | // this software will be error-free, and MIT is under no obligation to
 | 
					
						
							|  |  |  | // provide any services, by way of maintenance, update, or otherwise.
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // 5. In conjunction with products arising from the use of this material,
 | 
					
						
							|  |  |  | // there shall be no use of the name of the Massachusetts Institute of
 | 
					
						
							|  |  |  | // Technology nor of any adaptation thereof in any advertising,
 | 
					
						
							|  |  |  | // promotional, or sales literature without prior written consent from
 | 
					
						
							|  |  |  | // MIT in each case.
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | namespace factor { | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // Internal Interface to Bignum Code
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #undef BIGNUM_ZERO_P
 | 
					
						
							|  |  |  | #undef BIGNUM_NEGATIVE_P
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // The memory model is based on the following definitions, and on the
 | 
					
						
							|  |  |  | // definition of the type `bignum_type'.  The only other special
 | 
					
						
							|  |  |  | // definition is `CHAR_BIT', which is defined in the Ansi C header
 | 
					
						
							|  |  |  | // file "limits.h".
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 05:50:24 -04:00
										 |  |  | typedef fixnum bignum_digit_type; | 
					
						
							|  |  |  | typedef fixnum bignum_length_type; | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-06 14:42:59 -04:00
										 |  |  | #ifndef _WIN64
 | 
					
						
							| 
									
										
										
										
											2012-04-05 12:17:35 -04:00
										 |  |  | #ifdef FACTOR_64
 | 
					
						
							|  |  |  | typedef __int128_t bignum_twodigit_type; | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2013-05-13 00:28:25 -04:00
										 |  |  | typedef int64_t bignum_twodigit_type; | 
					
						
							| 
									
										
										
										
											2012-04-05 12:17:35 -04:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-04-06 14:42:59 -04:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-04-05 12:17:35 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // BIGNUM_TO_POINTER casts a bignum object to a digit array pointer.
 | 
					
						
							| 
									
										
										
										
											2014-06-16 17:57:38 -04:00
										 |  |  | #define BIGNUM_TO_POINTER(bignum) ((bignum_digit_type*)(bignum->data()))
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // BIGNUM_EXCEPTION is invoked to handle assertion violations.
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #define BIGNUM_EXCEPTION abort
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | #define BIGNUM_DIGIT_LENGTH (((sizeof(bignum_digit_type)) * CHAR_BIT) - 2)
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #define BIGNUM_HALF_DIGIT_LENGTH (BIGNUM_DIGIT_LENGTH / 2)
 | 
					
						
							| 
									
										
										
										
											2013-05-13 00:53:47 -04:00
										 |  |  | #define BIGNUM_RADIX (bignum_digit_type)(((cell)1) << BIGNUM_DIGIT_LENGTH)
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | #define BIGNUM_RADIX_ROOT (((bignum_digit_type) 1) << BIGNUM_HALF_DIGIT_LENGTH)
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | #define BIGNUM_DIGIT_MASK (BIGNUM_RADIX - 1)
 | 
					
						
							|  |  |  | #define BIGNUM_HALF_DIGIT_MASK (BIGNUM_RADIX_ROOT - 1)
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | #define BIGNUM_START_PTR(bignum) ((BIGNUM_TO_POINTER(bignum)) + 1)
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 21:47:29 -04:00
										 |  |  | #define BIGNUM_LENGTH(bignum) (untag_fixnum((bignum)->capacity) - 1)
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-04 02:00:30 -04:00
										 |  |  | #define BIGNUM_NEGATIVE_P(bignum) (bignum->data()[0] != 0)
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | #define BIGNUM_SET_NEGATIVE_P(bignum, neg) (bignum->data()[0] = neg)
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | #define BIGNUM_ZERO_P(bignum) ((BIGNUM_LENGTH(bignum)) == 0)
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | #define BIGNUM_REF(bignum, index) (*((BIGNUM_START_PTR(bignum)) + (index)))
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | // These definitions are here to facilitate caching of the constants
 | 
					
						
							|  |  |  | // 0, 1, and -1.
 | 
					
						
							| 
									
										
										
										
											2015-12-10 04:07:57 -05:00
										 |  |  | #define BIGNUM_ZERO() untag<bignum>(special_objects[OBJ_BIGNUM_ZERO])
 | 
					
						
							|  |  |  | #define BIGNUM_ONE(neg_p) untag<bignum>(        \
 | 
					
						
							|  |  |  |             special_objects[neg_p ? OBJ_BIGNUM_NEG_ONE : OBJ_BIGNUM_POS_ONE]) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define HD_LOW(digit) ((digit) & BIGNUM_HALF_DIGIT_MASK)
 | 
					
						
							|  |  |  | #define HD_HIGH(digit) ((digit) >> BIGNUM_HALF_DIGIT_LENGTH)
 | 
					
						
							|  |  |  | #define HD_CONS(high, low) (((high) << BIGNUM_HALF_DIGIT_LENGTH) | (low))
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | #define BIGNUM_BITS_TO_DIGITS(n) \
 | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  |   (((n) + (BIGNUM_DIGIT_LENGTH - 1)) / BIGNUM_DIGIT_LENGTH) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BIGNUM_DIGITS_FOR(type) \
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  |   (BIGNUM_BITS_TO_DIGITS((sizeof(type)) * CHAR_BIT)) | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifndef BIGNUM_DISABLE_ASSERTION_CHECKS
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-11 21:44:20 -04:00
										 |  |  | #define BIGNUM_ASSERT(expression) \
 | 
					
						
							|  |  |  |   {                               \ | 
					
						
							|  |  |  |     if (!(expression))            \ | 
					
						
							|  |  |  |       BIGNUM_EXCEPTION();         \ | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-05-02 05:04:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-21 10:26:04 -04:00
										 |  |  | #endif // not BIGNUM_DISABLE_ASSERTION_CHECKS
 | 
					
						
							| 
									
										
										
										
											2009-05-04 02:46:13 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |