//***********************************************************************
// FileDescription: Fast Algorithms Library For Huge Integer.
// FileVersion: 2007-12-08
// ProductVersion: 8, 0, 0, 0
//
// Portability: ANSI C++
// Base Classes: None.
// Related Document: HugeCalc.chm
//
// Copyright (c) 1992-2007 by Guo XianQiang. All rights reserved.
//
//
// Web: http://www.emath.ac.cn/hugecalc/
// BBS: http://bbs.emath.ac.cn/
// E-Mail: gxqcn@163.com; HugeCalc@Gmail.com
//***********************************************************************
// If you find any bug or you want to add some useful function
// please email to me. Redistribution and use in source are
// permitted provided that: source distributions retain this
// entire copyright notice and comment.
// 如果你在使用中发现BUG或添加了功能,请Email我。
// 你可以使用与发布该文件,但不得进行商业用途。
// 你的发布要包含完整的本文件头。
/*
附加说明:
1、调用程序所在目录必须为 /CopyrightByGuoXianqiang/[../],否则 HugeCalc.dll 会拒绝任何服务。
2、如需解除上述限制,请在 HugeCalc.chm 中进行“注册”。
3、HugeCalc 最新正式版下载链接为:http://www.emath.ac.cn/software.htm#HugeCalc
4、本导出接口文件可自动适应 MBCS / UNICODE 环境调用。
5、欢迎进行各项测试,如果发现bug,请及时联系,谢谢!
6、请务必遵守配套的 HugeCalc.chm 的相关声明!
郭先强(gxqcn@163.com; HugeCalc@Gmail.com)
2007-12-08
*/
#ifndef __cplusplus
#error Must use C++ for HugeCalc.
#endif
#if !defined(AFX_HUGECALC_H__99330C8A_F843_4e32_876B_D0DF036B4E05__INCLUDED_)
#define AFX_HUGECALC_H__99330C8A_F843_4e32_876B_D0DF036B4E05__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include < WTYPES.H >
//add to your .cpp file:
// #pragma message( "automatic link to ../../../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
// #pragma comment( lib, "../../../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
// ================ typedef ================
#ifndef _SINT32
#define _SINT32
typedef INT32 SINT32;
#endif // !defined(_SINT32)
#ifndef _SINT64
#define _SINT64
typedef INT64 SINT64;
#endif // !defined(_SINT64)
// ================ enum ================
typedef enum tagHCLicenseLevel
{
HC_LICENSE_NONE = 0x00, /* 很容易转换成 HC_LICENSE_DEMO */
HC_LICENSE_DEMO = 0x01, /* 使用上略有限制 */
HC_LICENSE_ALL = 0x02, /* 注册后获得单机所有权限 */
HC_LICENSE_CUSTOM = 0xFF, /* 客户定制,欢迎联系洽谈 */
}HCLicenseLevel;
typedef enum tagHCErrCode
{
HCERR_NONE = 0,
HCERR_NO_LICENSE = 1,
HCERR_USER_STOP = 2,
HCERR_NO_ENOUGH_MEMORY = 3,
HCERR_INVALID_POINTER = 4,
HCERR_DIV_ZERO = 5,
HCERR_BASE2SMALL = 6,
HCERR_RADIX2SMALL = 7,
//...
}HCErrCode;
typedef enum tagSIGN
{
SIGN_NEG = -1, // Negative
SIGN_ZERO = 0, // Zero
SIGN_POS = 1, // Positive
}SIGN;
typedef enum tagTimerUnit
{
TIMER_UNIT_ms = 0, // millisecond
TIMER_UNIT_us = 1, // microsecond
TIMER_UNIT_ns = 2, // millimicrosecond
}TimerUnit;
typedef enum tagFormatTime
{
FT_HHMMSS_ms = 0, // "00:00:12.345"
FT_DOT06SEC = 1, // "12.345678"
FT_DOT06SECs = 2, // "12.345678s"
FT_DOT06SEC_s = 3, // "12.345678 s"
}FormatTime;
typedef enum tagPrimality
{
COMPOSITE = 0,
PROBABLY_PRIME = 1,
PRIME = 2,
}PRIMALITY;
// ================ struct ================
typedef struct tagCVECTOR_UINT32
{
CONST UINT32 * p_start;
UINT32 u32Size;
#ifdef __cplusplus
tagCVECTOR_UINT32( CONST UINT32 * CONST _p_start = NULL, CONST UINT32 _u32Size = 0 )
: p_start( _p_start ), u32Size( _u32Size )
{
};
#endif
} CVECTOR_UINT32, FAR *PCVECTOR_UINT32;
typedef CONST CVECTOR_UINT32 FAR *LPCVECTOR_UINT32;
// ================ CONST ================
CONST BYTE FS_NORMAL = 0x00; // normal format
CONST BYTE FS_BAND = 0x01; // ' ' or ',' at pre 3[or4] digits from right
CONST BYTE FS_BAND_SPACE = 0x02; // must setting "| FS_BAND"
CONST BYTE FS_SIGN = 0x04; // even if "+"
CONST BYTE FS_SIGN_SPACE = 0x08; // between sign and number
CONST BYTE FS_CHAR_LOWER = 0x10; // will use [0-9a-z]; otherwise, use [0-9A-Z]
CONST BYTE FS_DEFAULT = FS_BAND | FS_BAND_SPACE | FS_SIGN_SPACE; // default format
#define _POW2_32 0 /* for base or radix */
#define _HC_Export_HC 0x00000001 /* 25 functions */
#define _HC_Export_HI 0x00000002 /* 91 functions */
#define _HC_Export_HX 0x00000004 /* 92 functions */
#define _HC_Export_RC 0x00000008 /* 24 functions */
#define _HC_Export_HugeCalc 0x00010000 /* 36 functions */
#define _HC_Export_CHugeInt 0x00020000 /*204 functions */
#define _HC_Export_CHugeIntX 0x00040000 /*205 functions */
#define _HC_Export_CRadixConverter 0x00080000 /* 28 functions */
#define _HC_Export_ANSI_C 0x0000FFFF /*236 functions */
#define _HC_Export_ANSI_CPLUSPLUS 0xFFFF0000 /*473 functions */
#define _HC_Export_All 0xFFFFFFFF /*709 functions */
#if !( defined( UNICODE ) || defined( _UNICODE ))
#define GetVer GetVerA
#define GetSN GetSNA
#define GetTimerStr GetTimerStrA
#define GetStr GetStrA
#define GetHexStr GetHexStrA
#define GetStrRadix GetStrRadixA
#define GetText GetTextA
#else
#define GetVer GetVerW
#define GetSN GetSNW
#define GetTimerStr GetTimerStrW
#define GetStr GetStrW
#define GetHexStr GetHexStrW
#define GetStrRadix GetStrRadixW
#define GetText GetTextW
#endif
#define HUGECALC_API WINBASEAPI /*__declspec(dllimport)*/
#define HC_API HUGECALC_API
namespace HugeCalc
{
// class CHugeInt;
// class CHugeIntX;
HC_API CONST LPCTSTR GetVer( VOID );
HC_API CONST LPCTSTR GetSN( VOID );
HC_API CONST HCLicenseLevel GetLicenseLevel( VOID );
HC_API CONST UINT32 GetExportFunNums( CONST UINT32 u32Mask = _HC_Export_ANSI_CPLUSPLUS );
HC_API CONST HCErrCode GetLastError( VOID );
// It usefull when use multithread.
HC_API VOID SetTerminate( CONST BOOL bTerminate = TRUE );
HC_API CONST BOOL IsTerminated( VOID );
HC_API VOID SeedRandom( CONST UINT32 u32Seed = 0 );
// before calculate, pls call bEnableTimer as TRUE, and after finishing call as FALSE
HC_API VOID ResetTimer( CONST UINT32 u32Timer = 0, CONST TimerUnit enumTimerUnit = TIMER_UNIT_us );
HC_API VOID EnableTimer( CONST BOOL bEnableTimer = TRUE );
HC_API CONST UINT32 GetTimer( CONST TimerUnit enumTimerUnit = TIMER_UNIT_us );
HC_API CONST LPCTSTR GetTimerStr( CONST FormatTime enumFormatTime = FT_DOT06SEC_s );
HC_API CONST BOOL IsPrime( CONST UINT32 u32Num );
HC_API CONST UINT32 GetPrimePi( CONST UINT32 u32Num );
HC_API CONST UINT32 GetPrime( CONST UINT32 u32Index );
HC_API CONST UINT32 GetPrimeCount( CONST UINT32 u32LBound, CONST UINT32 u32UBound );
HC_API CONST UINT32 GetPrimeList( UINT32 * CONST lpPrimeBuffer, CONST UINT32 u32BufferSize, CONST UINT32 u32LBound, CONST UINT32 u32UBound );
// Returns the largest prime number less than the argument.
HC_API CONST SINT32 PreviousPrime( CONST SINT32 s32Benchmark );
// Returns the smallest prime number greater than the argument.
HC_API CONST SINT32 NextPrime( CONST SINT32 s32Benchmark );
// gives the Euler totient function φ(n).
HC_API CONST UINT32 EulerPhi( CONST UINT32 n );
// gives the Jacobi symbol(n/m).
HC_API CONST SINT32 JacobiSymbol( CONST UINT32 n, CONST UINT32 m );
// gives the multiplicative order of k modulo n, defined as the smallest integer x such that k^x ≡ 1 mod n.
HC_API CONST UINT32 MultiplicativeOrder( CONST UINT32 k, CONST UINT32 n );
// give a primitive root of n, where n is a prime power or twice a prime power.
HC_API CONST UINT32 PrimitiveRoot( CONST UINT32 n );
// Greatest Common Divisor
HC_API CONST UINT32 Gcd( CONST UINT32 u32Num1, CONST UINT32 u32Num2 );
HC_API CONST UINT32 Gcd( CONST SINT32 s32Num, CONST UINT32 u32Num );
HC_API CONST UINT32 Gcd( CONST UINT32 u32Num, CONST SINT32 s32Num );
HC_API CONST UINT32 Gcd( CONST SINT32 s32Num1, CONST SINT32 s32Num2 );
HC_API CONST UINT32 Gcd( CONST CVECTOR_UINT32& vU32Num );
// GcdEx: g = GcdEx( x, y, u, v ) = u * x + v * y. g is always positive, even if one or both of u and v are negative.
HC_API CONST UINT32 GcdEx( SINT32 &x, SINT32 &y, CONST SINT32 u, CONST SINT32 v );
// InvertMod: x = InvertMod( b, m ) && !(!x) <==> ( b * x ) mod m = 1
HC_API CONST UINT32 InvertMod( CONST UINT32 u32InvertBase, CONST UINT32 u32Mod );
// Lowest Common Multiple
HC_API CONST UINT64 Lcm( CONST UINT32 u32Num1, CONST UINT32 u32Num2 );
HC_API CONST UINT64 Lcm( CONST SINT32 s32Num, CONST UINT32 u32Num );
HC_API CONST UINT64 Lcm( CONST UINT32 u32Num, CONST SINT32 s32Num );
HC_API CONST UINT64 Lcm( CONST SINT32 s32Num1, CONST SINT32 s32Num2 );
// PowMod
HC_API CONST UINT32 PowMod( CONST UINT32 u32Base, CONST UINT32 u32Exp, CONST UINT32 u32Mod );
HC_API CONST UINT32 PowMod( CONST UINT32 u32Base, CONST SINT32 s32Exp, CONST UINT32 u32Mod );
}
using namespace HugeCalc;
#endif // !defined(AFX_HUGECALC_H__99330C8A_F843_4e32_876B_D0DF036B4E05__INCLUDED_)