Numeri perfetti in C++/Python!

In questo breve howto viene spiegato come utilizzare Boost per creare un modulo Python da usare per trovare i numeri perfetti. (non tutti ovviamente, per questioni di hardware)

{i} Guida all'installazione:
Se non avete ancora installato Boost.Python consiglio di leggere la guida per l'installazione.

Innanzitutto creiamo una cartella di prova nella nostra directory home o sul nostro desktop. Chiamiamola 'PerfectNumber'. Poi scriviamo le nostre funzioni in C++

#include <iostream>
using std::cout;
using std::endl;

#include <cmath>

bool isPerfect(unsigned long n)
{
    unsigned long nPerfect = 0;
    for (unsigned long x = 1; x < n; x++)
    {
        if (n % x == 0 )
            nPerfect += x;
    }
    if (nPerfect == n)
        return true;
    else
        return false;
}

void getPerfects(unsigned long n)
{

    unsigned long perfect = 0;
    for (unsigned long i = 1; i <= n; i++)
    {
        perfect = pow(2, i)*(pow(2, (i+1))-1);
        if (isPerfect(perfect))
        {
            cout << perfect << endl;
        }
    }
}

Potete utilizzare queste funzioni in una comune applicazione C++, ma a noi serve che venga usata in Python.
Per fare ciò che ci serve dobbiamo aggiungere alcune righe:

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(Perfect)
{
    def("isPerfect", isPerfect);
    def("getPerfects", getPerfects);
}

In quest'ultima parte di codice includiamo due librerie : 'module.hpp' e 'def.hpp'. Entrambe servono per poter creare il modulo Python (con la macro BOOST_PYTHON_MODULE ) e la funzione (con il pythonico def)

Dopo aver salvato il nostro file con nome 'Perfect.cpp' nella nostra cartella 'PerfectNumber', creiamo un file (sempre nella stessa cartella) di nome 'Jamroot', contenente queste righe:

# File: Jamroot
use-project boost
  : ../ ;

project : requirements <library>/usr/lib/libboost_python.so
<include>/usr/include/python2.5 ;

python-extension Perfect : Perfect.cpp ;

Infine entriamo nella directory superiore alla nostra cartella "PerfectNumber" (ad es.: '$HOME/Desktop/' se avete scelto di creare la cartella sul vostro Desktop) e creiamo un file di nome 'project-root.jam' vuoto.
Entriamo di nuovo nella cartella 'PerfectNumber' e da terminale diamo il comando:

bjam

Avrete un output come questo:

...found 13 targets...
...updating 5 targets...
MkDir1 bin
MkDir1 bin/gcc-4.3
MkDir1 bin/gcc-4.3/debug
gcc.compile.c++ bin/gcc-4.3/debug/Perfect.o
gcc.link.dll bin/gcc-4.3/debug/Perfect.so
...updated 5 targets...

Entrate nella cartella 'bin/gcc-X.Y/debug' appena creata. Copiate il file Perfect.so (o la .dll creata se vi trovate su Windows) nella cartella 'PerfectNumber'. Lì create un file ('test_perfect.py') per testare se è andato tutto a buon fine:

from Perfect import isPerfect, getPerfects

print "Sto usando la funzione isPerfect in Python per ottenere i numeri perfetti."
for x in range(1, 10000):
    if isPerfect(x):
        print x

print "Sto usando la funzione getPerfects (dichiarata in C++) per ottenere i numeri perfetti."
getPerfects(10)

Potete notare che la funzione "getPerfects" è più veloce dell'altro metodo. Tuttavia è possibile ottimizzare il codice per generare numeri perfetti in Python alla velocità del C/C++. Questo è soltanto un esempio per mostrare come è possibile usare C++ in Python.


CategoryDocumentazione

Librerie/EstenderePython/Boost/NumeriPerfetti (last edited 2008-08-27 17:01:11 by Markon)