Algoritmo di Zakiya

Stato
Discussione chiusa ad ulteriori risposte.
Librerie condivise di ELF
Per eseguire la compilazione di libfoo.so come libreria condivisa, i passi di base hanno la seguente forma:


$ gcc -fPIC -c *.c
$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
$ ln -s libfoo.so.1.0 libfoo.so.1
$ ln -s libfoo.so.1 libfoo.so
$ LD_LIBRARY_PATH='pwd':$LD_LIBRARY_PATH ; export LD_LIBRARY_PATH


Questi comandi genererano una libreria condivisa denominata libfoo.so.1.0, i collegamenti appropriati per ld (libfoo.so) e il caricamento dinamico (libfoo.so.1) per trovarla. Per eseguire un collaudo, si aggiunge la directory corrente a LD_LIBRARY_PATH.


Quando si è sicuri che la libreria funziona, deve essere spostata, ad esempio, in /usr/local/lib, e devono essere creati appropriati collegamenti. Il collegamento da libfoo.so.1 a libfoo.so.1.0 è mantenuto aggiornato da ldconfig, che nella maggior parte dei sistemi viene eseguito come parte del processo di avviamento. Il collegamento libfoo.so deve essere aggiornato manualmente. Se si è scrupolosi nell'eseguire l'aggiornamento di tutte le parti di una libreria (ossia degli header file) contemporaneamente, la cosa più semplice da fare consiste nel rendere libfoo.so -> libfoo.so.1, in modo che ldconfig mantenga correnti entrambi i collegamenti. In caso contrario, potrebbe in seguito verificarsi ogni genere di stranezza.


$ su
# cp libfoo.so.1.0 /usr/local/lib
# /sbin/ldconfig
# ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so )
su windows funziona e ovviamente crea una dll in pe (non in elf) di nome libfoo.so, ma ho fatto solo questi comandi (elimina tutti i file *.o prima) - il terzo non serve
Codice:
$ gcc -fPIC -c zakiya.c
$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
$ ln -s libfoo.so.1.0 libfoo.so.1
 
devi linkarlo nella creazione della lib comunque
-Wl,-soname,libprova.so.0 -o libprova.so.0.1
poi
ln -s libprova.so.0.1 libprova.so.0
ln -s libprova.so.0 libprova.so
e puoi linkare -lprova :D
 
dicci che sistema operativo usi, e che versione di gcc/g++ usi. Giusto, anche quale versione delle tre che ti ho dato (C C/C++ C++)
 
Sono su Linux Ubuntu 10.04, gcc 4.4.3 e compilo la versione C.
Ora va già un po' meglio. Ho compilato ma quando importo:
Undefined symbol: SoZP7a

Ma quando compilo main.c con -fPIC devo mettere anche zakiya.c ?
 
sono contento.... dimmi poi se funziona perfettamente e se è ci sono cose che non vanno bene ^^
:EDIT:
perchè main.* sono dei file che ho creato per testare loa funzione che si trova in zakiya.*
 
Ehm ho trovato un errore. Bisognerebbe aggiungere una linea di codice.
Codice:
def SoZP7a(val):
    # all prime candidates > 7 are of form 210*k+(1,11,13,17,19,23,29,31,37
    # 41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,121,127,131
    # 137,139,143,149,151,157,163,167,169,173,179,181,187,191,193,197,199,209)
    num = val-((val&1)^1)        # se è pari sottrae 1
    mod=210; rescnt=48           # valore del modulo; numero dei residui
    maxprms = (rescnt*num)//mod  # numero massimo di candidati per la primalità
    prms = [True]*maxprms        # crea una lista di valori True lunga maxprms
    primes = [2,3,5,7]   # Inizializza la lista di numeri primi

    # array di residui per trovare i candidati
    residues = [1,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,
         89,97,101,103,107,109,113,121,127,131,137,139,143,149,151,157,163,
         167,169,173,179,181,187,191,193,197,199,209,211]
    # hash di valori per trovare la posizione dei nonprimi nell'array prms
    pos = {}
    for i in xrange(rescnt): pos[residues[i]] = i-1 # riempie l'hash

    # sieve to eliminate nonprimes from prms
    limit = int(ceil(sqrt(val))) # calcola il limite: radice quadrata di val
    x=r=0  # inizializza x e r a 0
    for prm in prms:   # cicla su ogni valore di prms
        r += 1   # r = r + 1
        if r > 48: r = 1; x += 210
        if not prm: continue  # se prm è falso passa al prossimo valore
        prime = x + residues[r]  # prime è uguale a x più l'elemento r di residues
        primes.append(prime) #<<<<<<<<<<<<<<<< QUESTA<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        if limit < prime: break  # se limit è minore di prime blocca il ciclo
        m = prime*48
        for ri in residues[1:]:  # cicla su ogni numero in residues tranne il primo
           product = prime*(x+ri)
           if product > val: break
           # compute product position index in prms
           qq,rr  = divmod(product,210) # qq = product/210 rr = product % 210
           nonprmpos = qq*48 + pos[rr]
           for nprm in xrange(nonprmpos,maxprms,m): prms[nprm] = False
    # the prms array now has all the positions for primes 11..N
    if num < 9:  return primes[:1+num//2]
    if num < 11: return primes
    n = (48*(x//210)) + r - 1
    while not prms[n]:  # cicla finché l'elemento di prms alla posizione n è Falso
       n += 1; r += 1
       if r > 48: r = 1; x += 210
    for i in xrange(n,maxprms,1):
       if prms[i]: primes.append(x+residues[r]) # aggiunge all'arrray primes il valore x + l'elemento di residues in posizione r
       r += 1
       if r > 48: r = 1; x += 210
    if primes[-1] > num: primes.pop() # se l'ultimo elemento di primes è maggiore di num, elimina l'ultimo elemento di primes
    return primes

Dopo la 24 riga, ho cercato di evidenziarla. Se non è di troppo disturbo potresti modificare i file?
Grazie ancora e scusa per l'inconveniente!
 
infatti mi sembrava strano che saltava dei numeri primi^^

cmq nel file ci sono tutti i file, anche se ho cambiato solo i rispettivi zakiya.cpp
http://www.megaupload.com/?d=XQEMJ6FA
 
Stato
Discussione chiusa ad ulteriori risposte.