Я пытаюсь реализовать оболочку для запуска теста факторизации Фермата на открытом ключе. Я успешно создал общую библиотеку с помощью SWIG:
fermat.h:
#ifndef FERMAT_H
#define FERMAT_H
#include
#include
#include
class Fermat
{
private:
mpz_class key;
mpz_class ceil_sqrt(const mpz_class&);
public:
Fermat(mpz_class);
std::string test();
};
#endif
fermat.cpp:
#include "fermat.h"
#include
#include
#include
Fermat::Fermat(mpz_class n)
{
key = n;
}
std::string Fermat::test()
{
// Test logic. Not important
}
mpz_class Fermat::ceil_sqrt(const mpz_class& n)
{
// A helper function
}
Я скомпилировал это с помощью приведенного ниже файла Makefile и файла .i, необходимого для SWIG.
Makefile:
all:
swig -c++ -python -v -I/usr/include/ fermat.i
python setup.py build_ext --inplace
g++ -O3 -fPIC -c -lgmp -lgmpxx fermat.cpp
g++ -O3 -fPIC -c -lgmp -lgmpxx -I/usr/include/python3.10 fermat_wrap.cxx
g++ -shared fermat.o fermat_wrap.o -lgmp -lgmpxx -o _fermat.so
fermat.i:
%module fermat
%{
#define SWIG_FERMAT_WITH_INIT
#include "fermat.h"
%}
%include "std_string.i"
%include "fermat.h"
Теперь я могу включить этот модуль SWIG в свой код main.py, который вызывает этот тестовый метод. Я передаю значение e открытого ключа в виде десятичного числа в конструктор.
import fermat as f
key_decimal = 98372489374731875343284493738234 # arbitrarily long decimal number
test_fermat = f.Fermat(key_decimal)
print(test_fermat.test())
Вкратце: я пытаюсь передать целое число в Python конструктору, который принимает аргумент типа mpz_class. Насколько мне известно, не существует встроенного способа преобразования int в mpz_class, поэтому мой модуль SWIG становится бесполезным, пока я не найду способ заставить конструктор принимать это большое целое число в Python.
Выполнение приведенного выше кода Python приведет к ошибке TypeError: в методе «new_Fermat» аргумент 1 типа «mpz_class»
Я читал о картах типов в SWIG, которые могут пригодиться, но я не уверен, что они решат мою проблему. Я думал, что сначала попрошу здесь заверения.
EDIT: В качестве временного исправления я переписал конструктор, чтобы вместо этого принимать std::string-s и передавать ключ в виде строки.
Fermat::Fermat(std::string n)
{
mpz_set_str(key.get_mpz_t(), n.c_str(), 10);
}
test_fermat = f.Fermat(str(key_decimal))
factors_string = test_fermat.test()
Подробнее здесь: https://stackoverflow.com/questions/786 ... in-the-swi
SWIG, Python-C++ и GMP — передача аргумента типа int функции в созданной SWIG общей библиотеке, которая принимает аргуме ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как преобразовать список[int, int, int] в кортеж[int, int, int], а не в кортеж[int, ...]
Anonymous » » в форуме Python - 0 Ответы
- 288 Просмотры
-
Последнее сообщение Anonymous
-