Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations derfloh on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Challenge 3

Status
Not open for further replies.

dbomrrsm

Programmer
Feb 20, 2004
1,709
GB
Write SQL code that will put all Prime numbers between 1 and 1000000 ( 1 million) into a table and then select a count from that table

Rules
1 You have to write everything from scratch, meaning we should be able to execute the script on any computer and get the same result
2 Don't show any code until the 31st January (next Tuesday)
3 We should only show the time and recordcount so that people will have a general idea if their code is fast enough
example PIV 3.0 Ghz 2GB RAM runtime 21 seconds recordcount 567
People should post this every time they improve their code so that we can see what's going on
4 The first five people who sign up will run all the scripts and list the in execution time order or we can designate 5 people it doesn't matter
5 remember the FASTEST time wins, it doesn't have to look pretty

Good luck

[bandito] [blue]DBomrrsm[/blue] [bandito]

[blue]Software code, like laws and sausages, should never be examined in production[/blue][black] - [/black][purple]Edward Tenner[/purple]
 
Since it appears we only have two people running the code and there were five slots open, I will gladly also run any code that comes along.

And Dave - you can futz with my code anytime!
 
no I am embarresed with my code...it runs in 7 minutes
 
Djbjr,

Don't feel badly about your entry...I threw together a solution without first seeing Dave's (Carp's) and mine ran longer than yours.[banghead] I must sit down and pour over Dave's to understand why his is so lightning fast.

[santa]Mufasa
(aka Dave of Sandy, Utah, USA)
[ Providing low-cost remote Database Admin services]
Click here to join Utah Oracle Users Group on Tek-Tips if you use Oracle in Utah USA.
 
OK well dont bother running it....

DECLARE

v_number1 number;
v_number3 number;
v_number7 number;
v_number9 number;
v_count number;

BEGIN
v_number1 := 1;
v_number3 := 3;
v_number7 := 7;
v_number9 := 9;

insert into prime values (v_number7);

v_number1 := v_number1 + 10;
v_number3 := v_number1 + 10;
v_number7 := v_number1 + 10;
v_number9 := v_number1 + 10;



WHILE v_number1 < 5001 LOOP


select count(*) into v_count from
(select prime_number from prime where prime_number < v_number1/2)
where MOD(v_number1, prime_number) = 0;

If v_count = 0
Then
insert into prime values (v_number1);
end if;

select count(*) into v_count from
(select prime_number from prime where prime_number < v_number3/2)
where MOD(v_number3, prime_number) = 0;

If v_count = 0
Then
insert into prime values (v_number3);
end if;

select count(*) into v_count from
(select prime_number from prime where prime_number < v_number7/2)
where MOD(v_number7, prime_number) = 0;

If v_count = 0
Then
insert into prime values (v_number7);
end if;

select count(*) into v_count from
(select prime_number from prime where prime_number < v_number9/2)
where MOD(v_number9, prime_number) = 0;

If v_count = 0
Then
insert into prime values (v_number9);

end if;

v_number1 := v_number1 + 10;
v_number3 := v_number1 + 10;
v_number7 := v_number1 + 10;
v_number9 := v_number1 + 10;


select count(*) into v_count from
(select prime_number from prime where prime_number < v_number3/2)
where MOD(v_number3, prime_number) = 0;

If v_count = 0
Then
insert into prime values (v_number3);
end if;


select count(*) into v_count from
(select prime_number from prime where prime_number < v_number9/2)
where MOD(v_number9, prime_number) = 0;

If v_count = 0
Then
insert into prime values (v_number9);

end if;

v_number1 := v_number1 + 10;
v_number3 := v_number1 + 10;
v_number7 := v_number1 + 10;
v_number9 := v_number1 + 10;

select count(*) into v_count from
(select prime_number from prime where prime_number < v_number1/2)
where MOD(v_number1, prime_number) = 0;

If v_count = 0
Then
insert into prime values (v_number1);
end if;


select count(*) into v_count from
(select prime_number from prime where prime_number < v_number7/2)
where MOD(v_number7, prime_number) = 0;

If v_count = 0
Then
insert into prime values (v_number7);
end if;

v_number1 := v_number1 + 10;
v_number3 := v_number1 + 10;
v_number7 := v_number1 + 10;
v_number9 := v_number1 + 10;


end loop;


v_number1 := 2;
insert into prime values (v_number1);

v_number1 := 3;
insert into prime values (v_number1);

v_number1 := 5;
insert into prime values (v_number1);
commit;

end;
/



Basically what I was trying to do was do the least amount of divisions possible. I knew that every even number is not prime along with every 3rd odd number. Also I knew that every number that ended in 5 was not prime. Thats why I have 3 sets of comparisions in the loop.

I concede to CARP! WTG CARP!
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top