Avatar billede ferret Nybegynder
09. maj 2003 - 10:59 Der er 22 kommentarer og
1 løsning

Primtal checker.

Ok så er jeg her igen, fyren med det matematiske tendenser.

Jeg sad og kedede mig en dag, så jeg beslutte mig for at skrive en funktion der kunne checke om et tal er et primtal den ser sådan her ud:

int IsPrime(int tal)
{
    if(tal < 2){return 0;}
    int i = tal - 1;       
   
    while(tal%i != 0)
        i--;             
                   
    if(i > 1)           
        return 0;
    else
        return 1;

   
}


Simpel, nej? Den er simpel og den virker, men den er også LANGSOM, især ved store tal, så mit spørgsmål er er der ikke en mere elegant og strømlinet måde at checke om et tal er et primtal?

Ser gerne kode eksembler og rent matematiske forlkaringer.
Avatar billede -mundi- Nybegynder
09. maj 2003 - 11:05 #1
hvis du skal have en primtalschecker der virker 100% så er der vist ikke andre måder at gøre det på, der er ikke nogen matematisk mmodel over primtal så vidt jeg ved
Avatar billede jpk Nybegynder
09. maj 2003 - 11:07 #2
Der er en række simple check man kan lave...

Hvis fx. 2 går op i tallet kan du afvise det med det samme...
Avatar billede ferret Nybegynder
09. maj 2003 - 11:08 #3
Ja, men det er jo også det funktionen gør den checket om alle tal fra tal -1 går op i tallet :> Jeg så gerne en matamatisk formel der kunne bruges.
Avatar billede erikjacobsen Ekspert
09. maj 2003 - 11:08 #4
Du behøver kun lave modulus med 2 og med ulige tal mellem 3 og
kvadratroden af dit tal.

Men der er effektivere måder at gøre det på - de er bare rimeligt
matematisk langhårede....
Avatar billede jpk Nybegynder
09. maj 2003 - 11:08 #5
Og så kan du tjekke om ulige tal går op i tallet (start fra 3) og tjek kun op til kvadratroden af tallet.
Avatar billede erikjacobsen Ekspert
09. maj 2003 - 11:10 #6
PS: Og start nedefra - der er rigtig mange tal hvor fx 3 går op.
Faktisk hver tredie - er det ikke et primtal så får du hurtigere svar
Avatar billede ferret Nybegynder
09. maj 2003 - 11:10 #7
Erikjakobsen - Ja, det er de metoder jeg gerne vil se, bare i en commented version self'.
Avatar billede jpk Nybegynder
09. maj 2003 - 11:11 #8
erikjacobsen >> Det var godt ramt (11:08:49)
Avatar billede jpk Nybegynder
09. maj 2003 - 11:12 #9
Samme klokkeslet...
Avatar billede ferret Nybegynder
09. maj 2003 - 11:14 #10
Jeg mente de 'langhårede' versioner :>
Avatar billede -mundi- Nybegynder
09. maj 2003 - 11:15 #11
ja hit med nogen langhårede, det er det der er det sjove ved eksperten :-)
Avatar billede arne_v Ekspert
09. maj 2003 - 11:15 #12
Du skal nok bruge Sieve of Erasthones.
Avatar billede erikjacobsen Ekspert
09. maj 2003 - 11:16 #13
Jeg har ikke nogen referencer til detailjerede forklaring. Jeg har
vist nogle bøger og noter liggende rundt omkring.

Men er det primtal, der skal bruges til kryptering, vil man ikke
gøre det på denne måde, altså: vælge et stort tal, og set om det
nu tilfældigvis skulle være et primtal. Chancen er ikke så stor, så
man skal prøve mange.

I stedet for konstruerer man sig et primtal, noget i retning af:
vælg et lille primtal, fx 7. Konstruer, et tilfældigt tal, der
er noget større, og med garanti et primtal. Og bliv så ved
til det er stort nok. Og de skal være store til kryptering.
Avatar billede ferret Nybegynder
09. maj 2003 - 11:19 #14
Vil gerne se kode eksempler, C++ og helst kommenterede.

Må gerne være en primtals generator, istedet for en checket.
Avatar billede -mundi- Nybegynder
09. maj 2003 - 11:22 #15
Avatar billede Slettet bruger
09. maj 2003 - 11:26 #16
Faktisk kan man sjældent bevise at de store tal der benyttes til kryptering rent faktisk er primtal, men man kan bevise at sandsynligheden for at de ikke er er meget meget lille.
Avatar billede ferret Nybegynder
09. maj 2003 - 11:28 #17
Vil stadig gerne se en primtals generator :>
Avatar billede erikjacobsen Ekspert
09. maj 2003 - 11:29 #18
sandsynlighed for at noget er et primtal (hvis man ellers synes man
kan sige det på den måde) brugte man i gamle dage. Det du'r ikke
mere, når man nu kan konstruerede tal, der med garanti er primtal.
Avatar billede arne_v Ekspert
09. maj 2003 - 11:54 #19
Sieve of Erastones er meget simpel.

Eksempel:

static char *pri = NULL;

int isprime(int v)
{
    int i,j;
    if(pri==NULL) {
        pri = (char *)malloc(N+1);
        pri[0]=0;
        pri[1]=0;
        for(i=2;i<=N;i++) pri[i] = 1;
        for(i=2;i<=N;i++) {
            if(pri[i]) {
                for(j=2*i;j<=N;j+=i) {
                    pri[j]=0;
                }
            }
      }
    }
    return pri[v];
}

Det koster dyrt første gang den kaldes.

Og den kræver meget memory.

Men derefter er det jo bare et simpelt opslag.
Avatar billede arne_v Ekspert
09. maj 2003 - 11:55 #20
Primtals generatorer ? Så er vi ovre i den avancerede matematik !
Avatar billede ferret Nybegynder
09. maj 2003 - 11:58 #21
Vil såmend bare gerne se den, gerne med comments :>
Avatar billede erikjacobsen Ekspert
09. maj 2003 - 12:05 #22
Jeg tror nu ikke du får noget ud at se koden til sådan en
stump program - med eller uden kommentarer.

Du skal forstå matematikken først. Den er lidt halvgammel
(med mindre der er kommet en ny), men du kan med fordel
læse i Bruce Schneier: Applied Cryptography
Avatar billede ferret Nybegynder
09. maj 2003 - 12:08 #23
Hrm, ok tak jeg vil kigge efter den bog, jeg ved ikke hvem der skal ha' point..Arne_v er den eneste der hjar smidt et svar så moolah'en må gå til ham.
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
Kurser inden for grundlæggende programmering

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