Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:14 Der er 28 kommentarer og
1 løsning

tjek om et tal er et primtal

Jeg fandt følgende på php.net men det virker ikke. Er der en som kan fortælle hvorfor ?

Fejltekst:
Fatal error: Call to undefined function: gmp_prob_prime()

Programkode:
<?php
// definitely not a prime
echo gmp_prob_prime('6') . '\n';

// probably a prime
echo gmp_prob_prime("1111111111111111111") . "\n";

// definitely a prime
echo gmp_prob_prime("11") . "\n";
?>
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:17 #1
hov...

echo gmp_prob_prime("6") . "\n";

sådan.. :o)
Avatar billede coderdk Praktikant
17. december 2004 - 16:22 #2
gmp er ikke kompileret ind i din php? Lav en phpinfo(), du leder efter:

                gmp
    gmp support     enabled
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:23 #3
øhh.. er ikke lige med ?
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:32 #4
Er med på phpinfo()

Men der står intet om gmp...
Avatar billede coderdk Praktikant
17. december 2004 - 16:35 #5
Så har du ikke adgang til gmp, så må du lave din egen test ;)
Her er et eksempel:

<?php

    function is_prime( $n )
    {
        if ( $n < 1 )
        {
            return false;
        }
        if ( $n == 2 )
        {
            return true;
        }
        $maxtest = ceil( sqrt( $n ) );
        for ( $i = 3; $i < $maxtest; $i++ )
        {
            if ( $n % $i == 0 )
            {
                return false;
            }
        }
        return true;
    }

    function t( $n )
    {
        echo $n . " er " . ( is_prime( $n ) ? '' : 'ikke ' ) . "et primtal.<br>";
    }

    t( 29 );
    t( 42 );

?>
Avatar billede coderdk Praktikant
17. december 2004 - 16:35 #6
if ( $n < 1 )

bør nok rettes til:

if ( $n <= 1 )
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:45 #7
Tak men...

Dit eksempel fortæller at 10 er et primtal !!
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:47 #8
jeg testede lige igen fra 1 til 10.. Allle tallene beregnes som primtal ??
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:48 #9
Det er jo kun 1 2 3 5 7
Avatar billede coderdk Praktikant
17. december 2004 - 16:49 #10
Eeerh 2 sek ;)
Avatar billede bromer Nybegynder
17. december 2004 - 16:50 #11
1 er ikke et primtal
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:50 #12
ok :o)
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:50 #13
Joo... 1 kan divideres med 1 og sig selv da..
Avatar billede bromer Nybegynder
17. december 2004 - 16:51 #14
ikke fordi jeg gider blande mig så meget, men idet for at tælle løkke 1 op hver gang kan man tælle den 2 op.. og så skifte

    if ( $n == 2 )
        {
            return true;
        }

ud med

  if ($n % 2 == 0 )
        {
            return ($n == 2);
        }
Avatar billede bromer Nybegynder
17. december 2004 - 16:52 #15
blueye97> indeed det kan det, men 1 er pr definition ikke et primtal...
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:53 #16
Nåh ok... Jeg er ikke matematikgeni... :o))
Avatar billede coderdk Praktikant
17. december 2004 - 16:54 #17
I min løkke skal

        for ( $i = 3; $i < $maxtest; $i++ )

ændres til:

        for ( $i = 2; $i <= $maxtest; $i++ )
Avatar billede blueeye97 Nybegynder
17. december 2004 - 16:56 #18
BOING !!!

Det virker efter hensigten. Tak og værsgo'
Avatar billede bromer Nybegynder
17. december 2004 - 16:56 #19
nejnej.. det giver heller ikke mening... hvad laver du med din maxtest?
Avatar billede bromer Nybegynder
17. december 2004 - 16:58 #20
så vidt jeg kan se går det da galt, hvis man smider 8 derind.. Det er ikke mindre end 1 og ej heller er det lig 2.. maxtest bliver sat til 4 og så har vi at 3 % 4 == 0 så vi retunerer true
Avatar billede coderdk Praktikant
17. december 2004 - 16:59 #21
bromer, Ikke forstået? Jeg finder bare ud af hvor mange jeg er nødt til at teste, for at teste et tal n, er det kun nødvendigt at checke tallene op til sqrt(n)...
Avatar billede coderdk Praktikant
17. december 2004 - 17:00 #22
bromer, $n % $i - hvis $n er 8 vil den teste 8 % 2 == 0 og fejle allerede der ;)
Avatar billede bromer Nybegynder
17. december 2004 - 17:01 #23
ahh.. okay.. det virker fordi du ændrede din løkke.. Det så jeg ikke.. af ren performence bør funktionen ændres til:

  function is_prime($n) {
      if ($n % 2 == 0) {
            return ($n == 2);
      }
        $maxtest = ceil( sqrt( $n ) );
        for ($i = 3; $i < $maxtest; $i += 2)
        {
            if ( $n % $i == 0 )
            {
                return false;
            }
        }
        return true;
    }
Avatar billede coderdk Praktikant
17. december 2004 - 17:04 #24
bromer, ja det kunne man optimere med :) Funktionen vil så se således ud:

    function is_prime( $n )
    {
        if ( $n < 1 )
        {
            return false;
        }
        if ( $n % 2 == 0 )
        {
            return true;
        }
        $maxtest = ceil( sqrt( $n ) );
        for ( $i = 3; $i < $maxtest; $i += 2 )
        {
            if ( $n % $i == 0 )
            {
                return false;
            }
        }
        return true;
    }

Det var faktisk den jeg burde have rettet først ;)
Avatar billede coderdk Praktikant
17. december 2004 - 17:10 #25
lol ja det var så også forkert kom jeg til at tænke på, den første test skal stadig være der:

    function is_prime( $n )
    {
        if ( $n < 1 )
        {
            return false;
        }
        if ( $n == 2 )
        {
            return true;
        }
        if ( $n % 2 == 0 )
        {
            return false;
        }
        $maxtest = ceil( sqrt( $n ) );
        for ( $i = 3; $i < $maxtest; $i += 2 )
        {
            if ( $n % $i == 0 )
            {
                return false;
            }
        }
        return true;
    }
Avatar billede bromer Nybegynder
17. december 2004 - 17:25 #26
jaja.. så er det jo samme forslag.. der er ingen forskel på

        if ( $n == 2 )
        {
            return true;
        }
        if ( $n % 2 == 0 )
        {
            return false;
        }

og

      if ($n % 2 == 0) {
            return ($n == 2);
      }
Avatar billede coderdk Praktikant
17. december 2004 - 17:26 #27
bromer, Det er mig der sover, det er da rigtigt ;)
Avatar billede suxor Nybegynder
18. december 2004 - 17:24 #28
blueeye - grunden til 1 ikke er et primtal er at for et tal kan være et primtal skal det have 2 divisorer, hverken færre eller flere, og da 1 kun har en divisor {1}, kan det ikke være et primtal.
Avatar billede bromer Nybegynder
18. december 2004 - 18:24 #29
Fra "Matematik 2AL - Algebra" af Anders Thorup fra Københavns Universitet:

"Et naturligt tal p kaldes som bekendt et primtal hvis p > 1 og p kun har trivielle divisoerer (dvs hvis de enste posivitive divisorer i p er 1 og p)".

det er helt rigtigt det suxor sagde, men det ville da ikke være rigtig Lørdag, hvis man ikke kunne citere en matematiker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester