Avatar billede photop Nybegynder
08. december 2003 - 12:49 Der er 15 kommentarer og
3 løsninger

Afgøre om et tal er et primtal.

Findes der ikke en funktion i Excel til at afgøre om et tal er et primtal?
Jeg skal ikke bruge den på specielt store tal, så selvfølgelig kunne man bare skrue en standard-makro sammen der forsøger division med alle ulige tal fra 3 til kvadratroden af tallet, men jeg ville gerne slippe for at bruge makroer.
Avatar billede jkrons Professor
08. december 2003 - 12:53 #1
Så vidt jeg ved findes der ikke en sådan funktion i Excel.
08. december 2003 - 13:33 #2
Du kunne jo prøve denne her:
=IF(((MOD(A8,2)<>0)*(MOD(A8,3)<>0)*(MOD(A8,5)<>0)*(MOD(A8,7)<>0)),"Primtal","AlmTal")
Avatar billede jkrons Professor
08. december 2003 - 13:39 #3
Flemming. Den gælder kun meget små tal! Den vil fx kalde 143 for et primtal :-)
Avatar billede Slettet bruger
08. december 2003 - 22:52 #5
Hvor store tal drejer det sig om ?
Avatar billede kabbak Professor
08. december 2003 - 23:08 #6
Function Primtal(Tal As Long)

Dim lngAntal As Long

Dim lngHalva As Long

lngHalva = Tal / 2 + 1

For lngAntal = 2 To lngHalva

  If (Tal Mod lngAntal) = 0 Then

    Primtal = ""

    Exit Function

  End If

Next

Primtal = "Primtal"

End Function


fundet her http://www.kentexcel.com/VB-tips.htm#Primtal
Avatar billede photop Nybegynder
09. december 2003 - 08:07 #7
>Jkrons
Tja, det lader til du har ret. Det er bare underligt at Derive (det program der ligger på min TI-89'er) både kan afgøre om et tal er primtal, samt opløse pænt store tal i alle dets primfaktorer på et par sekunder, og så kan Excel ingen af delene???

>Flemmingdahl
Din løsning er selvfølgelig kun brugbar på rimelig små tal, men det er dog en Excel-løsning uden makroer, og udvider jeg den med de følgende primtal op til 31 er det faktisk nok til at løse det konkrete problem jeg arbejder med.

>Blackadder
I det konkrete tilfælde er det kun tal <= 1000.

>Kabbak
Tak for funktionen, men det er ikke lige det jeg står og mangler.
Avatar billede photop Nybegynder
09. december 2003 - 08:11 #8
>Kabbak
Desuden er funktionen ikke så effektiv. Den tester alle tal fra 2 til X/2. Faktisk er det rigeligt at teste op til kvadratroden af X. Desuden ville det være smart kun at teste de ulige tal da der jo ikke findes lige primtal > 2.
Avatar billede janvogt Praktikant
09. december 2003 - 09:43 #9
Photop, du kan bruge denne array-formel:

=OR(A6=2;A6=3;ISNA(MATCH(TRUE;A6/ROW(INDIRECT("2:"&INT(SQRT(A6))))=INT(A6/ROW(INDIRECT("2:"&INT(SQRT(A6)))));0)))

Den returner SAND, hvis tallet i A6 er et primtal og ellers FALSK.

Formlen skal "afleveres" med CTRL+SHFT+ENTER, hvorved der kommer nogle turborgklammer om formlen.
Sig til, hvis du skal have den oversat til dansk.
Avatar billede janvogt Praktikant
09. december 2003 - 09:48 #10
Formlen kan teste tal op til 65.535^2, som er det maksimale array-størrelse i Excel 97/2000.
Avatar billede photop Nybegynder
09. december 2003 - 11:56 #11
>Janvogt
Spændende - men jeg vil gerne have den oversat til DK.
OR, TRUE og ROW giver sig selv
INT = HELTAL
SQRT = KVROD
MATCH = SAMMENLIGN ???
INDIRECT = INDIREKTE ???

Men ISNA har jeg ikke noget bud på.

I øvrigt skal jeg da vist læse lidt på Array-formler - har jeg aldrig arbejdet med i Excel før! Når jeg har skrevet formlen skal jeg altså trykke CTRL+SHFT+ENTER i stedet for ENTER som jeg plejer?!?
Avatar billede jkrons Professor
09. december 2003 - 11:58 #12
ISNA = ER.IKKE.TILGÆNGELIG
Avatar billede jkrons Professor
09. december 2003 - 12:00 #13
Derudover har du ret i de andre.
Avatar billede janvogt Praktikant
09. december 2003 - 12:03 #14
Ja, det må være noget lignende:

{=ELLER(A5=2;A5=3;ER.IKKE.TILGÆNGELIG(SAMMENLIGN(
SAND;A5/RÆKKE(INDIREKTE("2:"&HELTAL(KVROD(A5))))
=HELTAL(A5/RÆKKE(INDIREKTE("2:"&HELTAL(KVROD(A5)))));0)))}

Ja præcis, du skal trykke CTRL+SHFT+ENTER i stedet for ENTER.
Avatar billede janvogt Praktikant
09. december 2003 - 12:11 #15
Formlen fungerer ved, at alle potentielle prim-faktorer divideres op i tallet, og array-resultatet testes for at se, om det er et helt tal.
Er det IKKE et helt tal, er tallet et primtal.
Avatar billede photop Nybegynder
09. december 2003 - 12:16 #16
Kanon - det fungerer jo perfekt.

Det eneste der mangler er min forståelse. Det må være i argumentet til INDIREKTE at array-delen kommer ind - eftersom ethvert ikke-primtal har mindst en primfaktor mellem 2 og kvadratroden af tallet selv.
Men syntax'en i argumentet til INDIREKTE fatter jeg ikke!
Avatar billede jkrons Professor
09. december 2003 - 12:28 #17
Primtal er en vidunderlig ting :-)

2^20996011-1 er det størst kendte Mersenneprimtal, altså et primtal udregnet efter formlen 2^P-1.

Tallet har mere en 6,3 millioner cifre og ville fylde mere end 1.500 A4 sider udskrevet :-)  Bare til almindelig info.
Avatar billede Slettet bruger
09. december 2003 - 15:51 #18
Den "klassiske" måde at gøre det på er ved hjælp af en algoritme der hedder
"Sieve of Eratosthenes". Her implementeret som en VBA funktion.

----------------------
Option Base 1

Function isPrime(n As Integer) As Boolean

Dim primeArray() As Boolean
ReDim primeArray(n)
Dim i As Integer
Dim j As Integer

For i = 1 To n
    primeArray(i) = True
Next i
primeArray(1) = False

For i = 2 To Sqr(n)
    For j = i + 1 To n
        If j Mod i = 0 And primeArray(j) <> False Then
            primeArray(j) = False
        End If
    Next j
Next i

isPrime = primeArray(n)

End Function
-----------------
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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