33,022
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include "gmp.h"
#include "HugeCalc.h"
#pragma comment( lib, "libgmp-3.lib" )
#define _NO_HI
unsigned long sizeList[16] = {256, 512, 1024, 1536, 2048, 3072, 4096,
8192, 10240, 16384, 64000, 65536, 256000, 512000, 1048576, 33554432};
char a[10485760], b[10485760];
char hexChar[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
void RandomStr(int sizes) //随机填充16进制数字
{
srand(GetTickCount());
a[0] = b[0] = 'F'; //保证达到特定大小
for (int i = 1; i < sizes; i ++)
{
a[i] = hexChar[rand() % 16];
b[i] = hexChar[rand() % 16];
}
a[sizes] = '\0';
b[sizes] = '\0';
}
int main(int argc, _TCHAR* argv[])
{
mpz_t gmp_a, gmp_b, gmp_c;
HHUGEINTX huge_a, huge_b, huge_c;
LPCTSTR lpszA, lpszB;
LARGE_INTEGER CountFreq, start, stop;
double UsedTime;
int mult;//重复次数
QueryPerformanceFrequency(&CountFreq);
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
//初始化
mpz_init(gmp_a);
mpz_init(gmp_b);
mpz_init(gmp_c);
hugeCalcDLLInit( (LPCTSTR)"d:\\hugecalc\\copybyguoxianqiang\\hugecalc" );
for (int i = 0; i < 16; i ++)
{
printf("现在计算长度(bits): %d\n", sizeList[i]);
RandomStr(sizeList[i] / 4);
//GMP Test
mpz_set_str(gmp_a, a, 16);
mpz_set_str(gmp_b, b, 16);
QueryPerformanceCounter(&start);
if (sizeList[i] < 10000) mult = 1000; else mult = 1;
for (int j = 0; j < mult; j ++)
mpz_mul(gmp_c, gmp_a, gmp_b);
QueryPerformanceCounter(&stop);
UsedTime = (double)(stop.QuadPart - start.QuadPart) * 1000000.0 / (double)CountFreq.QuadPart / (double)mult;
printf(" GMP包计算时间(us): %.3f\n", UsedTime);
//HugeCalc Test
huge_a = HX_new();
huge_b = HX_new();
huge_c = HX_new();
lpszA = (LPCTSTR)(LPSTR)a;
lpszB = (LPCTSTR)(LPSTR)b;
HX_setHexStr(huge_a, lpszA);
HX_setHexStr(huge_b, lpszB);
QueryPerformanceCounter(&start);
if (sizeList[i] < 10000) mult = 1000; else mult = 1;
for (int j = 0; j < mult; j ++)
HX_mul(huge_c, huge_a, huge_b);
QueryPerformanceCounter(&stop);
UsedTime = (double)(stop.QuadPart - start.QuadPart) * 1000000.0 / (double)CountFreq.QuadPart / (double)mult;
printf(" HugeCalc包计算时间(us):%.3f\n", UsedTime);
HX_delete(huge_a);
HX_delete(huge_b);
HX_delete(huge_c);
}
mpz_clear(gmp_a);
mpz_clear(gmp_b);
mpz_clear(gmp_c);
hugeCalcDLLFree();
return 0;
}
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include "Include/gmp.h"
#include "Include/HugeCalc.h"
#include "Include/HugeIntX.h"
#pragma comment( lib, "lib/libgmp-3.lib" /*"lib/gmp.lib"*/ )
#pragma comment( lib, "lib/HugeCalc.lib" )
unsigned long sizeList[] = {256, 512, 1024, 1536, 2048, 3072, 4096,
8192, 10240, 16384, 64000, 65536, 256000, 512000, 1048576, 33554432, 0x4000000, 0x6000000/*, 0x8000000, 0xC000000*/};
char hexChar[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
bool showLastErr( void )
{
bool bErr = TRUE;
switch( HugeCalc::GetLastError() )
{
case HCERR_NO_LICENSE:
printf("Last Error: HCERR_NO_LICENSE\n");
break;
case HCERR_USER_STOP:
printf("Last Error: HCERR_USER_STOP\n");
break;
case HCERR_NO_ENOUGH_MEMORY:
printf("Last Error: HCERR_NO_ENOUGH_MEMORY\n");
break;
case HCERR_INVALID_POINTER:
printf("Last Error: HCERR_INVALID_POINTER\n");
break;
case HCERR_DIV_ZERO:
printf("Last Error: HCERR_DIV_ZERO\n");
break;
case HCERR_BASE2SMALL:
printf("Last Error: HCERR_BASE2SMALL\n");
break;
case HCERR_RADIX2SMALL:
printf("Last Error: HCERR_RADIX2SMALL\n");
break;
case HCERR_NONE:
case HCERR_UNKNOWN:
default:
bErr = FALSE;
}
return bErr;
}
void RandomStr(char *p, int sizes) //随机填充16进制数字
{
srand(GetTickCount());
p[0] = 'F'; //保证达到特定大小
for (int i = 1; i < sizes; i ++)
{
p[i] = hexChar[rand() % 16];
}
}
int main(int argc, _TCHAR* argv[])
{
mpz_t gmp_a, gmp_b, gmp_c;
CHugeIntX huge_a, huge_b, huge_c;
LARGE_INTEGER CountFreq, start, stop;
double UsedTime;
int mult;//重复次数
int i, j;
char *pA, *pB;
QueryPerformanceFrequency(&CountFreq);
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
//初始化
mpz_init(gmp_a);
mpz_init(gmp_b);
mpz_init(gmp_c);
#if 1
# define _RATIO 10UL /* 被乘数与乘数长度之比 */
#else
# define _RATIO 1UL /* 被乘数与乘数长度之比 */
#endif
printf("*** 被乘数与乘数长度之比为:%d ***\n\n", _RATIO);
i = sizeof(sizeList)/sizeof(sizeList[0]);
j = sizeList[i-1] / 4;
pA = (char *)malloc( j + 1 );
RandomStr(pA, j);
j /= _RATIO;
pB = (char *)malloc( j + 1 );
RandomStr(pB, j);
for (i = 0; i < sizeof(sizeList)/sizeof(sizeList[0]); i ++)
{
printf("现在计算长度(bits): %d\n", sizeList[i]);
// 设定字串终止符
j = sizeList[i] / 4;
pA[j] = '\0';
pB[j/_RATIO] = '\0';
if (sizeList[i] < 10000) mult = 1000; else mult = 1;
//GMP Test
mpz_set_str(gmp_a, pA, 16);
mpz_set_str(gmp_b, pB, 16);
QueryPerformanceCounter(&start);
for (j = 0; j < mult; j ++)
mpz_mul(gmp_c, gmp_a, gmp_b);
QueryPerformanceCounter(&stop);
UsedTime = (double)(stop.QuadPart - start.QuadPart) * 1000000.0 / (double)CountFreq.QuadPart / (double)mult;
// printf( " gmp_c have %u bits\n", mpz_sizeinbase( gmp_c, 2 ) );
printf(" GMP 包计算时间(us):%.3f\n", UsedTime);
// 释放内存
mpz_set_ui( gmp_a, 0 );
mpz_set_ui( gmp_b, 0 );
mpz_set_ui( gmp_c, 0 );
//HugeCalc Test
huge_a.SetHexStr((LPCTSTR)pA);
huge_b.SetHexStr((LPCTSTR)pB);
QueryPerformanceCounter(&start);
for (j = 0; j < mult; j ++)
huge_c.Mul(huge_a, huge_b);
QueryPerformanceCounter(&stop);
UsedTime = (double)(stop.QuadPart - start.QuadPart) * 1000000.0 / (double)CountFreq.QuadPart / (double)mult;
// printf( "huge_c have %u bits\n", huge_c.GetBits() );
printf(" HugeCalc包计算时间(us):%.3f\n", UsedTime);
if ( showLastErr() )
break;
// 释放内存
huge_c = huge_a = huge_b = 0;
// 将字串终止符恢复成16进制数字
j = sizeList[i] / 4;
pA[j] = hexChar[rand() % 16];
pB[j/_RATIO] = hexChar[rand() % 16];
}
free( pA );
free( pB );
mpz_clear(gmp_a);
mpz_clear(gmp_b);
mpz_clear(gmp_c);
system( "pause" );
return 0;
}