GMP mpz_t 变量设置了不正确的值
GMP mpz_t variable being set with incorrect value
几天来我一直在研究 Euler 29 问题,但很难让 mpz_t 类型正常工作。 objective 是遍历 a^b 的值 2 <= a,b <= 100 并计算非重复值。
使用向量,我能够使用指针将值存储在数组中,如下所示:
mpz_t a;
mpz_init(a);
vector<mpz_t*> numbers;
numbers.push_back(&a);
但是,当 运行 下面的完整程序可以看到,在它插入第一个值 4 之后,它没有插入任何新值。这是因为与 rop 进行比较的 temp 值并未设置为数组中已有的值,而是设置为 rop 共享的值。
#include <iostream>
#include <vector>
#include <chrono>
#include "gmp.h"
using namespace std;
int main()
{
auto start = std::chrono::high_resolution_clock::now();
int solution = 0;
bool found = false;
int r = 10;
mpz_t rop;
mpz_init(rop);
mpz_t temp;
mpz_init(temp);
vector<mpz_t*> numbers;
for(int a = 2; a <= 5; a++)
{
for(int b = 2; b <= 5; b++)
{
mpz_ui_pow_ui(rop, a, b);
for(int i = 0; i < numbers.size(); i++)
{
cout << "i: " << i << endl;
cout << "rop: ";
mpz_out_str(stdout,10,rop);
cout << endl;
mpz_set(temp,*(numbers.at(i)));
cout << " temp: ";
mpz_out_str(stdout,10,temp);
cout << endl;
r = mpz_cmp(rop,temp);
cout << " r: " << r << endl << endl;
if(r == 0)
{
found = true;
break;
}
}
if(found == false)
{
numbers.push_back(&rop);
solution++;
cout << "pushed! " << endl << endl;
}
found = false;
}
}
auto done = std::chrono::high_resolution_clock::now();
cout << "Solution: " << solution << endl << endl;
cout << "Program completed in " << std::chrono::duration_cast<std::chrono::milliseconds>(done - start).count() << " milliseconds." << endl;
}
这行代码应该在 forloop 开始时将 temp 设置为 4,而是将其设置为 rop:
mpz_set(temp,*(numbers.at(i)));
由于问题显然与我使用指针并将实际地址传递到内存中以存储这些 mpz_t 变量有关,我该如何更改代码才能使其正常工作适当地?我的印象是在每个 push_back 之后使用函数 mpz_clear(rop) 到数字向量是行不通的,因为它会从内存中释放地址。
我发现由于 mpz_t 变量的工作方式,mpz_set 函数无法使用指向 mpz_t 类型变量的指针作为参数。
相反,我能够通过将 mpz_get_str 函数分配给字符串并将其推送到字符串向量以检查重复值来让程序运行。
mpz_t rop;
mpz_init(rop);
char * num;
vector<string> numbers;
num = mpz_get_str(num,10,rop)
numbers.push_back(num);
几天来我一直在研究 Euler 29 问题,但很难让 mpz_t 类型正常工作。 objective 是遍历 a^b 的值 2 <= a,b <= 100 并计算非重复值。
使用向量,我能够使用指针将值存储在数组中,如下所示:
mpz_t a;
mpz_init(a);
vector<mpz_t*> numbers;
numbers.push_back(&a);
但是,当 运行 下面的完整程序可以看到,在它插入第一个值 4 之后,它没有插入任何新值。这是因为与 rop 进行比较的 temp 值并未设置为数组中已有的值,而是设置为 rop 共享的值。
#include <iostream>
#include <vector>
#include <chrono>
#include "gmp.h"
using namespace std;
int main()
{
auto start = std::chrono::high_resolution_clock::now();
int solution = 0;
bool found = false;
int r = 10;
mpz_t rop;
mpz_init(rop);
mpz_t temp;
mpz_init(temp);
vector<mpz_t*> numbers;
for(int a = 2; a <= 5; a++)
{
for(int b = 2; b <= 5; b++)
{
mpz_ui_pow_ui(rop, a, b);
for(int i = 0; i < numbers.size(); i++)
{
cout << "i: " << i << endl;
cout << "rop: ";
mpz_out_str(stdout,10,rop);
cout << endl;
mpz_set(temp,*(numbers.at(i)));
cout << " temp: ";
mpz_out_str(stdout,10,temp);
cout << endl;
r = mpz_cmp(rop,temp);
cout << " r: " << r << endl << endl;
if(r == 0)
{
found = true;
break;
}
}
if(found == false)
{
numbers.push_back(&rop);
solution++;
cout << "pushed! " << endl << endl;
}
found = false;
}
}
auto done = std::chrono::high_resolution_clock::now();
cout << "Solution: " << solution << endl << endl;
cout << "Program completed in " << std::chrono::duration_cast<std::chrono::milliseconds>(done - start).count() << " milliseconds." << endl;
}
这行代码应该在 forloop 开始时将 temp 设置为 4,而是将其设置为 rop:
mpz_set(temp,*(numbers.at(i)));
由于问题显然与我使用指针并将实际地址传递到内存中以存储这些 mpz_t 变量有关,我该如何更改代码才能使其正常工作适当地?我的印象是在每个 push_back 之后使用函数 mpz_clear(rop) 到数字向量是行不通的,因为它会从内存中释放地址。
我发现由于 mpz_t 变量的工作方式,mpz_set 函数无法使用指向 mpz_t 类型变量的指针作为参数。
相反,我能够通过将 mpz_get_str 函数分配给字符串并将其推送到字符串向量以检查重复值来让程序运行。
mpz_t rop;
mpz_init(rop);
char * num;
vector<string> numbers;
num = mpz_get_str(num,10,rop)
numbers.push_back(num);