Hi, If I'm not wrong, the code you mentioned seems to be falling into an infinite loop? Taking the number 22 as you did, the first while loop cycle completes with num=3 as the following if condition holds true if(num%2==0) // 22mod2 = 0 But during the second cycle, this condition doesn't hold (which is ok), but the proceeding for loop doesn't execute, as sq and i will be equivalent (3): for(i=3; i<=sq; i+=2) // i = sq, condition holds, loop doesn't enter into first cycle. and since i and sq are equal, following condition doesn't also hold: if(i>sq) { ready=true; .... infinity I think, the above condition can be made as: if (i >= sq) just a suggestion Regards, Varun On 10/9/09, black ares <matematicianu2003@xxxxxxxxxxx> wrote: > in fact you take the number 22 > you will take the square root it is 4. > you search amoung all primes less than square root until you find one which > divides your number. > In our case you find 2. > You divide your number by that prime found and for the result you repeat the > algorithm > You repeat this algorithm until you will not find any prime less than the > square root which divides your number. > In our case 22/2=11 square root of 11 is 3 the only prime less than 3 is 2 > you take the modulo of 11 to 2 and you find that is 1 not 0 so stop. > Now the last number you found is also a prime factor so the result of your > program is 2, 11. > In a pseudo language I see tthe code like this: > > int num=22;//any other number works > bool ready=false; > arraylist results=new arraylist(); > while(!ready) > { > if(num%2==0) > { > results.add(2); > num/=2; > continue; > } > int sq=Math.Floor(Math.Sqrt(num)); > int i=3; > for(i=3; i<=sq; i+=2) > { > if(num%i==0) > { > num/=i; > results.add(i); > break; > } > > } > if(i>sq) > { > ready=true; > results.add(num); > } > } > > ----- Original Message ----- > From: "qubit" <lauraeaves@xxxxxxxxx> > To: <programmingblind@xxxxxxxxxxxxx> > Sent: Saturday, October 10, 2009 7:41 AM > Subject: Re: prime factors shortcut question > > >> no, you are not understanding what I'm saying... >> Do the following: >> >> maxfac = floor(sqrt(22)) >> >> This yields 4, as you said. >> >> Now walk through all the primes p greater than 1 and less than or equal to >> maxfac. The only prime is 2, as you said. >> But 22 divided by 2 is 11, which is prime. So it can be added to the pool >> of primes. Therefore you already know that 11 is prime without actually >> doint the math for all the numbers instead of those less than 4. >> The algorithm is something like the following pseudo code: >> >> // num = number being factored >> max = floor(square root of num) >> for each prime between 2 and floor(square root(num) >> Doing it any more would give duplicate results. >> >> Anyway, sorry about the inconvenience. Happy reading. >> --le >> >> ----- Original Message ----- >> From: "Alex Hall" <mehgcap@xxxxxxxxx> >> To: <programmingblind@xxxxxxxxxxxxx> >> Sent: Friday, October 09, 2009 10:56 PM >> Subject: Re: prime factors shortcut question >> >> >> I will try it. A question, though: is this only for certain numbers? Look >> at >> 22 (2*11): >> Math.floor(sqrt(22))=4 >> factors of 4: 2 >> no 11? >> >> >> Have a great day, >> Alex >> New email address: mehgcap@xxxxxxxxx >> ----- Original Message ----- >> From: "qubit" <lauraeaves@xxxxxxxxx> >> To: <programmingblind@xxxxxxxxxxxxx> >> Sent: Friday, October 09, 2009 11:41 PM >> Subject: Re: prime factors shortcut question >> >> >>> take the floor of the square root. --le >>> >>> >>> ----- Original Message ----- >>> From: "Alex Hall" <mehgcap@xxxxxxxxx> >>> To: "Blind Programming List" <programmingblind@xxxxxxxxxxxxx> >>> Sent: Friday, October 09, 2009 2:13 PM >>> Subject: prime factors shortcut question >>> >>> >>> Hi all, >>> I am trying to find the prime factors of a massive number, over 600 >>> billion, >>> in perl (it is just an activity in a class, not an assignment). I know >>> you >>> can factor the square root, which is good since I cannot store such a big >>> number in a simple scalar in perl, but I run into a problem: the square >>> root >>> of my number is not a whole number, but a decimal. Of course, then, any >>> modulus I try will not work since a decimal mod any whole number will not >>> return 0. What do I do? Do I get the floor or ceiling of the square root >>> operation? Is there another trick? I do not need something vastly complex >>> that works for most situations or explains things from a cryptographic >>> standpoint, all I need is what to do with my decimal square root so >>> modding >>> works and gives me factors. Thanks for any help! >>> >>> >>> Have a great day, >>> Alex >>> New email address: mehgcap@xxxxxxxxx >>> >>> __________ >>> View the list's information and change your settings at >>> //www.freelists.org/list/programmingblind >>> >>> __________ >>> View the list's information and change your settings at >>> //www.freelists.org/list/programmingblind >>> >> >> __________ >> View the list's information and change your settings at >> //www.freelists.org/list/programmingblind >> >> __________ >> View the list's information and change your settings at >> //www.freelists.org/list/programmingblind >> > > __________ > View the list's information and change your settings at > //www.freelists.org/list/programmingblind > > -- Varun __________ View the list's information and change your settings at //www.freelists.org/list/programmingblind