1 /* bignum.h                                        -*- mode:c; coding:utf-8; -*-
2  *
3  *   Copyright (c) 2010-2021  Takashi Kato <ktakashi@ymail.com>
4  *
5  *   Redistribution and use in source and binary forms, with or without
6  *   modification, are permitted provided that the following conditions
7  *   are met:
8  *
9  *   1. Redistributions of source code must retain the above copyright
10  *      notice, this list of conditions and the following disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above copyright
13  *      notice, this list of conditions and the following disclaimer in the
14  *      documentation and/or other materials provided with the distribution.
15  *
16  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22  *   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  *   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24  *   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25  *   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  *   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  *  $Id: $
29  */
30 #ifndef SAGITTARIUS_PRIVATE_BIGNUM_H_
31 #define SAGITTARIUS_PRIVATE_BIGNUM_H_
32 
33 #include "sagittariusdefs.h"
34 
35 #define BIGNUM_SIZE(size) (sizeof(SgBignum)+((size)-1)*sizeof(long))
36 
37 SG_CDECL_BEGIN
38 
39 SG_EXTERN SgObject Sg_MakeBignumFromSI(long value);
40 SG_EXTERN SgObject Sg_MakeBignumFromUI(unsigned long value);
41 SG_EXTERN SgObject Sg_MakeBignumFromS64(int64_t value);
42 SG_EXTERN SgObject Sg_MakeBignumFromU64(uint64_t value);
43 SG_EXTERN SgObject Sg_MakeBignumFromDouble(double value);
44 SG_EXTERN SgObject Sg_MakeBignumWithSize(long size, unsigned long init);
45 SG_EXTERN SgObject Sg_BignumCopy(SgBignum *b);
46 SG_EXTERN SgObject Sg_NormalizeBignum(SgBignum *b);
47 SG_EXTERN int      Sg_BignumCmp(SgBignum *lhs, SgBignum *rhs);
48 
49 SG_EXTERN double   Sg_BignumToDouble(SgBignum *b);
50 SG_EXTERN SgObject Sg_BignumToInteger(SgBignum *b);
51 SG_EXTERN long          Sg_BignumToSI(SgBignum *b, int clamp, int *oor);
52 SG_EXTERN unsigned long Sg_BignumToUI(SgBignum *b, int clamp, int *oor);
53 
54 SG_EXTERN long     Sg_BignumBitCount(SgBignum *b);
55 SG_EXTERN long     Sg_BignumBitSize(SgBignum *b);
56 SG_EXTERN long     Sg_BignumFirstBitSet(SgBignum *b);
57 SG_EXTERN int      Sg_BignumBitSetP(SgBignum *b, long n);
58 SG_EXTERN int      Sg_BignumAbsCmp(SgBignum *bx, SgBignum *by);
59 SG_EXTERN int      Sg_BignumCmp3U(SgBignum *bx, SgBignum *off, SgBignum *by);
60 
61 SG_EXTERN SgObject Sg_BignumToString(SgBignum *b, int radix, int use_upper);
62 
63 /* i don't want to think about 128 bit CPU */
64 #if SIZEOF_LONG >= 8
65 SG_EXTERN int32_t  Sg_BignumToS32(SgBignum *b, int clamp, int *oor);
66 SG_EXTERN uint32_t Sg_BignumToU32(SgBignum *b, int clamp, int *oor);
67 #define Sg_BignumToS64 Sg_BignumToSI
68 #define Sg_BignumToU64 Sg_BignumToUI
69 #else
70 #define Sg_BignumToS32 Sg_BignumToSI
71 #define Sg_BignumToU32 Sg_BignumToUI
72 SG_EXTERN int64_t  Sg_BignumToS64(SgBignum *b, int clamp, int *oor);
73 SG_EXTERN uint64_t Sg_BignumToU64(SgBignum *b, int clamp, int *oor);
74 #endif
75 
76 /* bignum arithmatics */
77 SG_EXTERN SgObject Sg_BignumComplement(SgBignum *bx);
78 SG_EXTERN SgObject Sg_BignumAshSI(long si, long count);
79 SG_EXTERN SgObject Sg_BignumAsh(SgBignum *b, long count);
80 SG_EXTERN SgObject Sg_BignumShiftLeft(SgBignum *b, long count);
81 SG_EXTERN SgObject Sg_BignumShiftRight(SgBignum *b, long count);
82 SG_EXTERN SgObject Sg_BignumLogAnd(SgBignum *x, SgBignum *y);
83 SG_EXTERN SgObject Sg_BignumLogIor(SgBignum *x, SgBignum *y);
84 SG_EXTERN SgObject Sg_BignumLogXor(SgBignum *x, SgBignum *y);
85 SG_EXTERN SgObject Sg_BignumLogAndSI(SgBignum *x, long y);
86 SG_EXTERN SgObject Sg_BignumLogIorSI(SgBignum *x, long y);
87 SG_EXTERN SgObject Sg_BignumLogXorSI(SgBignum *x, long y);
88 SG_EXTERN SgObject Sg_BignumAdd(SgBignum *a, SgBignum *b);
89 SG_EXTERN SgObject Sg_BignumAddSI(SgBignum *a, long b);
90 SG_EXTERN SgObject Sg_BignumSub(SgBignum *a, SgBignum *b);
91 SG_EXTERN SgObject Sg_BignumSubSI(SgBignum *a, long b);
92 SG_EXTERN SgObject Sg_BignumMul(SgBignum *a, SgBignum *b);
93 SG_EXTERN SgObject Sg_BignumMulSI(SgBignum *a, long b);
94 SG_EXTERN SgObject Sg_BignumDivRem(SgBignum *a, SgBignum *b);
95 SG_EXTERN SgObject Sg_BignumDivSI(SgBignum *a, long b, long *rem);
96 SG_EXTERN SgObject Sg_BignumModulo(SgBignum *a, SgBignum *b, int remp);
97 SG_EXTERN SgObject Sg_BignumModuloSI(SgBignum *a, long b, int remp);
98 SG_EXTERN SgObject Sg_BignumSqrt(SgBignum *bn);
99 SG_EXTERN SgObject Sg_BignumSqrtApprox(SgBignum *bn);
100 SG_EXTERN SgObject Sg_BignumAccMultAddUI(SgBignum *acc,
101 					 unsigned long coef,
102 					 unsigned long c);
103 
104 SG_EXTERN SgObject Sg_BignumGcd(SgBignum *bx, SgBignum *by);
105 SG_EXTERN SgObject Sg_BignumModInverse(SgBignum *bx, SgBignum *bm);
106 SG_EXTERN SgObject Sg_BignumModExpt(SgBignum *bx, SgBignum *be, SgBignum *bm);
107 SG_EXTERN SgObject Sg_BignumExpt(SgBignum *b, long n);
108 
109 SG_EXTERN SgObject Sg_BignumSquare(SgBignum *bx);
110 
111 /* internal use */
112 SG_EXTERN SgBignum* Sg_AllocateBignum(int size);
113 
114 SG_CDECL_END
115 
116 #endif /* SAGITTARIUS_BIGNUM_H_ */
117 
118 /*
119   end of file
120   Local Variables:
121   coding: utf-8-unix
122   End
123 */
124