Gå til innhold

Matlab - trenger litt innsikt


Anbefalte innlegg

Jeg har forsøkt å lage en funksjon som sjekker for primtall.

Har prøvd å bruke "Miller–Rabin primality test", men i tillegg til ikke å være helt stødig i matlab er jeg heller ikke helt sikker på selve matten.

 

Funksjonen finner primtall, men ikke alle. Feks 31 finner den ikke. Den skal i utgangspunktet finne alle primtallene, og noen som ikke er primtall med en feilmargin på 4^-k.

 

http://en.wikipedia...._primality_test

 

Hvorfor finner den ikke 31. Jeg tror noe av grunnen kan være mitt lavpannede forsøk på "%write n - 1 as 2^s * d with d odd by factoring powers of 2 from n - 1".

 

function [ out ] = prime( n )
%PRIME Summary of this function goes here
%   Detailed explanation goes here
%Input: n > 3, an odd integer to be tested for primality;
%Input: k, a parameter that determines the accuracy of the test
%Output: composite if n is composite, otherwise probably prime
%write n - 1 as 2^s * d with d odd by factoring powers of 2 from n - 1
%LOOP: repeat k times:
%   pick a random integer a in the range [2, n - 2]
%   x <- a^d mod n
%   if x = 1 or x = n - 1 then do next LOOP
%   for r = 1 .. s
%	  x <- x^2 mod n
%	  if x = 1 then return composite
%	  if x = n - 1 then do next LOOP
%   return composite
%return probably prime
n=31;
if n < 4;
out = 0;
return;
end
if mod(n,2) == 0
 out = 0;
 return;
end
s = 0;
d = (n-1)/(2.^(s));
while mod(d,2) == 0
	s = s+1;
	d = (n-1)/(2.^(s));
end

fd = floor(d);
while fd ~= d;
s = s + 1;
d = (n-1)/(2.^(s));
fd = floor(d);
end

k = 10;
t1 = 0;
while t1 < k
l=0;
a = randi((n-2),1,1);
x = mod((a.^d),n);
if x == 1
t1 = t1+1;
continue;
end
if x == (n-1)
t1 = t1+1;
continue;
end
for r = 1:s
x = mod((x.^2),n);
if x == 1
	out = 0;
end
if x == (n-1)
	t1 = t1 + 1;
	l=1;
	break;
end
end
if l == 1;
continue;
end
out = 0;
return;
end
out = 1;
return;
end

Lenke til kommentar
Videoannonse
Annonse
  • 2 uker senere...

Har hatt en øving hvor vi hadde i oppgave å lage en slik funksjon, her er i alle fall min kode:

%Oppgave 3
function prime = primtall(tall)
% primtall(5)
if tall < 1
   disp('Tallet er mindre enn 1 og kan derfor ikke være et primtall')
elseif tall == 2
   prime = true;
else
   for i = 2:(tall-1)
    if mod(tall,i) == 0
	    prime = false;
	   break
    else
	    prime = true;
    end
   end
end
end

 

Håper den hjelper noe, i tillegg har du den innebygde funksjonen isprime(x)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...