Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2007-05-26, 19:10
  #1
Medlem
Som en del av ett större projektet försöker jag hitta en rutin som inte hittar Sqrt() utan endast ser om det blir ett exakt värde utan decimaler.

Exempel:
Sqrt(81) = 9 -> Funktionen ger SANT
Sqrt(14) = 3.74165-> Funktionen ger FALSKT
Sqrt(100) = 10 -> Funktionen ger SANT

Hastighet är av absolut största vikt. Finns det någon lämplig snabb algoritm?
Citera
2007-05-26, 19:25
  #2
Medlem
Om det är programmering så borde du väl kunna ta roten ur ditt tal och sen ta ditt svar minus heltalsdelen av ditt svar och kolla om det blir 0?
Citera
2007-05-26, 19:31
  #3
Medlem
blueCommands avatar
Citat:
Ursprungligen postat av Larsson85
Om det är programmering så borde du väl kunna ta roten ur ditt tal och sen ta ditt svar minus heltalsdelen av ditt svar och kolla om det blir 0?

Rooten ur är en hyfsat långsam funktion så jag tror inte att han vill använda den
Citera
2007-05-26, 19:36
  #4
Medlem
Citat:
Ursprungligen postat av blueCommand
Rooten ur är en hyfsat långsam funktion så jag tror inte att han vill använda den

Helt rätt

Eftersom jag inte behöver varken värde (eller decimaler) hade jag hoppats att man kunde uppnå en högre hastighet.
Citera
2007-05-26, 19:51
  #5
Medlem
Ok, jag tvivlar på att det finns ett enklare sätt. Vad jag kan förstå så vill man kolla om ett tal har 2 och endast 2 lika primtalsfaktorer. Jag vet inte hur det skulle gå till, men kanske någon annan som vet.
Citera
2007-05-26, 19:53
  #6
Medlem
Citat:
Ursprungligen postat av Larsson85
Ok, jag tvivlar på att det finns ett enklare sätt. Vad jag kan förstå så vill man kolla om ett tal har 2 och endast 2 lika primtalsfaktorer. Jag vet inte hur det skulle gå till, men kanske någon annan som vet.

Projektet gäller optimering av en existerande faktoriseringsmetod. Så hade jag löst det enligt det sättet hade projektet redan varit klart
Citera
2007-05-26, 20:12
  #7
Medlem
Y0dAs avatar
En enkel algoritm för att undersöka om ett heltal N är en perfekt kvadrat, dvs att sqrt(N) är ett heltal, som endast kräver heltalsaritmetik:
Kod:
N = talet du vill testa
A = 1
while(N > 0)
begin
    N = N - A
    A = A + 2 
end
Om N nu är 0 var det en perfekt kvadrat, annars var det inte det.
Algoritmen är ju dock rätt långsam O(sqrt(N)) vilket kanske inte räcker för din applikation. Annars kan du kolla in källkoden till GMP-biblioteket och se hur de har löst det.
Citera
2007-05-26, 20:15
  #8
Medlem
Citat:
Ursprungligen postat av Larsson85
Vad jag kan förstå så vill man kolla om ett tal har 2 och endast 2 lika primtalsfaktorer.

Va? Nej, kvadratroten ur 81 är 9, men 9 är inte en primtalsfaktor för det.
Citera
2007-05-26, 20:28
  #9
Medlem
Citat:
Ursprungligen postat av Y0dA
En enkel algoritm för att undersöka om ett heltal N är en perfekt kvadrat, dvs att sqrt(N) är ett heltal, som endast kräver heltalsaritmetik:
Kod:
N = talet du vill testa
A = 1
while(N > 0)
begin
    N = N - A
    A = A + 2 
end
Om N nu är 0 var det en perfekt kvadrat, annars var det inte det.
Algoritmen är ju dock rätt långsam O(sqrt(N)).

Känns betydligt långsammare än den nuvarande jag använder:

http://en.wikipedia.org/wiki/Integer_square_root

Dock räknar den faktiskt ut värdet på roten. Vilket inte är nödvändigt. Hade hoppats att det fanns fina knep för att öka beräkningshastigheten om värdet var oviktigt. Exempelvis använder denna en väldigt massa div, vilket inte ger speciellt bra prestanda.
Citera
2007-05-26, 20:36
  #10
Medlem
Y0dAs avatar
Citat:
Ursprungligen postat av Ceru
Känns betydligt långsammare än den nuvarande jag använder:

http://en.wikipedia.org/wiki/Integer_square_root

Dock räknar den faktiskt ut värdet på roten. Vilket inte är nödvändigt. Hade hoppats att det fanns fina knep för att öka beräkningshastigheten om värdet var oviktigt. Exempelvis använder denna en väldigt massa div, vilket inte ger speciellt bra prestanda.
Kolla in hur de har löst det i källkoden till GMP-biblioteket: http://www.gmplib.org. De verkar ha ett bra sätt för att sålla bort tal: http://gmplib.org/manual/Perfect-Square-Algorithm.html.
Citera
2007-05-26, 20:38
  #11
Medlem
Citat:
Ursprungligen postat av Y0dA
Kolla in hur de har löst det i källkoden till GMP-biblioteket: http://www.gmplib.org. De verkar ha ett bra sätt för att sålla bort tal: http://gmplib.org/manual/Perfect-Square-Algorithm.html.

Mycket bra länk. Skall se om en ny implementation kan påverka exekveringstiden på programmet nämnvärt
Citera
2007-05-26, 20:50
  #12
Medlem
qracs avatar
Det finns bara en smart lösning till detta om hastighet är av största vikt men det kostar minne. Generera alla talen på förhand och vips så är kostnaden bara O(1) för kollen.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback