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