为什么我不能为 GMP 库分配 300 位或更少的整数?

Why can't I assign a 300 or less digits integer with the GMP library?

本文关键字:位或 整数 分配 不能 GMP 为什么      更新时间:2023-10-16

我有一个小代码和一个大整数:

int main()
{
mpz_clears;
mpf_clears;

  mpz_class a;
        a=130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191;

return 0;

并得到这个错误,所以我不能对整数做任何事情…

error: integer literal is too large to be represented in any
  integer type

我是在mac上,用xcode工具编译,使用最新的6.0.0a gmp库。

我错过了什么?

使用GMP不会神奇地使C/c++理解比基本语言规范更大的字面值。幸运的是,在带有用户定义字面值的c++ 11中,GMP有一个定义的字面值语法,因此字面值类型是mpz_class而不是int。只需将_mpz添加到整数字面值的末尾,例如

a=130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191_mpz;

c++类型不能处理你传递的大数字,它会抛出这个错误。

查看详细信息。整型在c++中可以存储什么范围的值

并且在文档中清楚地提到。

构造一个mpz_class。所有标准的c++类型都可以使用,除了long long和long double,所有GMP c++类都可以使用,尽管mpq_class和mpf_class的转换是显式的。任何必要的转换都遵循相应的C函数,例如double遵循mpz_set_d(参见赋值整数)。

仅仅因为您使用了一个大整数类,并不意味着编译器会突然变得能够处理超大整数字面值。像往常一样,没有后缀的文字被编译器视为int。对于int来说它太大了。

您应该使用c++ 11文字支持并提供带有_mpz后缀的文字值,或者将您的值表示为字符串。

嗯,即使使用_mpz选项,您可以分配的位数也可能有限制。我将位数减少到这样的大小,我可以存储整数:

130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191443885715160918938894478991212554338474935909274442208280226020332302710637502228813106477844481700372333640604211874260838332822176968781235304962300880267221110401606508880971834777831402249082184410637749400023282419270071233303228854128584088916313729295257781669730936517951304701393525757057288415991731506781288275420005462290126288405806701552761743270631625705587885293887371663631869096785158480771725887503591755610

要处理大数,你最好看看加密软件,比如openssl/bn.h

$ sudo apt-get install libssl-dev

MUL.cpp

#include <openssl/bn.h>
#include <ctime>
#include <string>
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;

// man bn
int main(int argc, char *argv[]) {
        BN_CTX *ctx = BN_CTX_new( );
        BIGNUM *a = NULL;
        BIGNUM *b = NULL;
        BIGNUM *mul = BN_new( );
        BN_dec2bn(&a, argv[1]);
        BN_dec2bn(&b, argv[2]);
        BN_mul( mul, a, b, ctx);
        string mul_str = BN_bn2dec( mul );
        cout << mul_str << endl;
        BN_free( a );
        BN_free( b );
        BN_free( mul );
        BN_CTX_free( ctx );
        return 0;
}

之后,

$ g++ -v -o MUL MUL.cpp -lcrypto -lrt
$ ./MUL 1111111111111111111111 11111111111111111111111111111111111111
12345679012345679012344444444444444444320987654320987654321

或者你的数字:

$ ./MUL 130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191443885715160918938894478991212554338474935909274442208280226020332302710637502228813106477844481700372333640604211874260838332822176968781235304962300880267221110401606508880971834777831402249082184410637749400023282419270071233303228854128584088916313729295257781669730936517951304701393525757057288415991731506781288275420005462290126288405806701552761743270631625705587885293887371663631869096785158480771725887503591755610130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191443885715160918938894478991212554338474935909274442208280226020332302710637502228813106477844481700372333640604211874260838332822176968781235304962300880267221110401606508880971834777831402249082184410637749400023282419270071233303228854128584088916313729295257781669730936517951304701393525757057288415991731506781288275420005462290126288405806701552761743270631625705587885293887371663631869096785158480771725887503591755610 130637788386308069046861449260260571291678458515671364436805375996643405376682659882150140370119739570729696093810308688223886144781635348688713392214619435345787110033188140509357535583193264801721383236152235906221860161085667905721519797609516199295279707992563172152784123713076584911245631751842633105652153513186684155079079372385923352208421842040532051768902602579344300869529063620569896872621227499787666438515766191438772844982077590564825560915004123788524793626088046688154064374425340131073611440941376503643793012676721171310302652283866154666880487476095144107907540698417260347310774677574064007810935083421437442654204085311165490420993090855747058348793757769523336364858305492927387281493416741250273266926840468154062676311322374882380011804120628601384191443885715160918938894478991212554338474935909274442208280226020332302710637502228813106477844481700372333640604211874260838332822176968781235304962300880267221110401606508880971834777831402249082184410637749400023282419270071233303228854128584088916313729295257781669730936517951304701393525757057288415991731506781288275420005462290126288405806701552761743270631625705587885293887371663631869096785158480771725887503591755610
17066231754465807402900420358384027625063828147296398970430735667107038565643532131029262436685775911914313380489264979150809498798501933158462145225528180551769789575574797447397445413420626589337764710733729094394489883580640065014326441503312557193537990957436917477463646907709648408216434453480535184067598892956346170907569131377903528411111853111366291979626086698383298307345834392212231046634063413666384508324419179368057389725477538706904589815650381926976015993762890040156790405503832003268981872633663593094738685190702324170124859881504272985658187233430078072074850856278428071856485129710354193089376603399949840797557269752404324626163227377490362755801388382649764643331010423816641928437135475590362260226952505888042595117331291587671568162632704073970431619934337538342580157600657762301792637641467188915728074681445126309949503670453577866959321057221058159530832970764856624653513410124322745428166790635701352502052256269558858525352939994015481804509533547301113993717358659764948833130929069642122698202129401970681574382516490304799923426506769877124709868229514010141819989355368364493152148025681360589017051459966742937386231341355101280349206933137558553397562834428892415453233148641176771563712134361104022807550303488698075859517457925640610491054979460976360319484563783286684527208609132950696416209270231736324410954950684352328008061594161733388271145413633779170942608933174781023093090166766097051317310022316050630811133583173184115645711370920550992076973922926411319105318826733544096711620052335678566140497081147253812896893420327059981797167126306338464682511753397155370448528529202208913712194212784573851259886750498508574755936271159501806286495680771291521438702898980393172655721876464226059755372992679372981146919582948873581755274102131988783345665739059331911729901433053990191883389538118335419875393994271684373681810615128035637305671352255611195822986723919966346614504211249964663541945984204985492046339446890342152602121983526036026284992402505355803385348589918367728082706040916985152635360901742191941842971992737551826097028139759998758915104121256359451340107345440703495802418055755094797175689110387208266417084593991014867282339917152309333902180775075816625489223370772738533933334770778564779976389719378964794125379024410157550786106085604852610915830834787247811239349553909171864850989169291577662971436559192161855924800900992398387001394175369368663291775977076397743722156192299105428781790818602044847522848431713923633708651868973304037943629982141197617707337073274179185426770132582538432486796714335942857724787044441406231875204080386533209509526701082724875806709758857092820176146255706651998803661272142775642520442391227251506425870387373189142488674432150155028643969780961833270806721943761674451332734094107418048448339730770862124109349834151523986716674077669261444236368571532558762173381119345015880991848768022539566069235387298433970531174140055934895491488406387322959686152870801506904417823703916926860536028705138822353298033104149394326119785714010793712166616781321617880422232478270993974660928438969267385851248329604086387551705361922068424614692617313923883706742816371720982187645987693446127391744743054010747707122729452000008024595790675203131690448164324982521914771679392295264057374903374105401693996933614023173316709739350993750161786196236271822749116371726461907551046689900873564981257387360500771251705433693927287093968802056959550818280473764856549882949501840084257149510400015730796750717240359458767805153426658794187889587166234478619647814190297313764503421633608458361966472100