vineri, 26 octombrie 2012

Ciurul lui Eratostene si algoritmul Atkin

Din pacate a trecut mai mult de o zi, insa revin cu restantele.

Ciurul lui Eratostene:
   function eratostene($number) {
        //construieste lista cu toate numerele
        for ($i=1;$i<$number;$i++) {
            $erat[$i]=1;
        }
        //elimina din lista multiplii fiecarui numar
        for ($i=2;$i<$number;$i++) {
            if ($erat[$i]) {
                for ($j=2;$j*$i<$number;$j++) {
                    $erat[$i*$j]=0;
                }
            }
        }
        return $erat;
    }

Algoritmul lui Atkin:

    function atkin($number) {
        //se construieste lista de numere, initializata cu valoarea 0
        for ($i=1;$i<$number;$i++) {
            $atkin[$i]=0;
        }
        //se adauga in  lista diverse numere prime
        for ($i=1;$i<sqrt($number);$i++) {
            for ($j=1;$j<sqrt($number);$j++) {
                $x=4*$i*$i+$j*$j;
                if ($x<$number && ($x%12==1 || $x%12==5)) {
                    $atkin[$x]=1;
                }
                $x=3*$i*$i+$j*$j;
                if ($x<$number && $x%12==7) {
                    $atkin[$x]=1;
                }
                $x=3*$i*$i-$j*$j;
                if ($i>$j && $x<$number && $x%12==11) {
                    $atkin[$x]=1;
                }
            }
        }
        //se elimina din lista patratele perfecte
        for ($i=5;$i<sqrt($number);$i++) {
            $x=$i*$i;
            $j=1;
            while ($j*$x<$number) {
                $atkin[$j*$x]=0;
                $j++;
            }
        }
        $atkin[2]=1;
        $atkin[3]=1;
        return $atkin;
    }
Desi din literatura de specialitate (chiar si din citirea la prima vedere a algoritmilor) am inteles ca Atkin ar fi mai rapid, mie mi-a iesit exact invers. Dar probabil numerele nu au fost suficient de mari.

luni, 22 octombrie 2012

Algoritm numere prime - PHP

Baiatul meu din clasa sasea avea ca tema niste exercitii cu numere prime. Si mi-a venit ideea sa fac un algoritm pentru cautarea numerelor prime.

Intai am scris un algoritm pentru a determina daca un numar este prim sau nu.

    function calculate($number) {
        $number=(int)abs($number);
        if ($number==0 or $number==1) {
            throw new Exception ("0 or 1 are special numbers!");
        }
        for ($i=2;$i<floor(sqrt($number)+1);$i++) {
            if (!($number%$i)) 
                return false;
        }
        return true;
    }

Dupa cum se vede calculeaza daca fiecare numar mai mic decat jumatatea sa este divizorul sau.

Dupa aceea m-am gandit ca ar fi bine daca as putea afla cel mai apropiat numar prim de un alt numar (cu conditia ca numarul prim sa fie mai mic). Si mi-a iesit ceva de genul:

    function smallerPrime($number) {
        if ($number<=2) {
            throw new Exception('2 is smaller prime number');
        }
        for ($i=$number-1;$i>1;$i--) {
            if (calculate($i)) {
                return $i;
            }
        }
    }

Maine o sa revin cu algoritmi pentru determinarea tuturor numerelor prime mai mici decat un numar: ciurul lui Eratosthene si algoritmul Atkin.

marți, 16 octombrie 2012

Singleton pattern

SINGLETON PATTERN

Definitie: Singletonul este o clasa speciala care genereaza doar o instanta de obiect.

Singletonul este similar unei variabile globale, permitand in plus adaugarea de elemente logice.

Acest tip de clasa este util atunci cand vrei ca obiectul sa poate fi accesat de oriunde din aplicatie, si mai ales atunci cand contine o cantitate mare de resurse si e ineficient de instantiat de mai multe ori. Are trei caracteristici principale:
  • o proprietate statica privata ce pastreaza singura instanta - nu poate fi accesata din afara clasei;
  • o metoda publica statica ce intoarce singura instanta;
  • un constructor privat - nu permite instantierea directa a obiectului;
Exemplu:
class Singleton
{
  static private $instance=NULL;

  private function __construct() {
    //poate fi si gol sau poate contine initializari
  }

  static public function getInstance() {
    if (self::$instance==NULL) {
      self::instance=new Singleton();
    }
    return self::$instance;
  }
  
  //nu permite clonarea obiectului
  protected function __clone() {}
}

joi, 11 octombrie 2012

Zend Framework - modificare mesaje de eroare pentru validari elemente de formular

Cum cel mai bine se poate invata din exemple, iata o modalitate de a seta un mesaj de eroare personalizat:

$alnum=new Zend_Validate_Alnum();
$alnum->setMessage('Trebuie sa folositi numai litere si cifre');

//aplicare validator la element
$element->addValidator($alnum);

In cazul folosirii regex pentru validare, un mesaj personalizat poate fi de genul:

$element->addValidator('regex', true, array (
    'pattern' =>'#^[a-zA-Z0-9)]+$#',
    'messages'=>'regexNotMatch'=>'Trebuie sa folositi numai litere si cifre')
    ));