Code archives/Algorithms/sqr function

This code has been declared by its author to be Public Domain code.

Download source code

sqr function by mindstorms
(Posted 20 years ago)
this returns the square root of a number in radical form, without decimals. I am not sure how this would be useful in a game, but feel free to use it.

Any advice on making this faster would be appreciated.
Graphics 200,13
AppTitle("sqr function")
Global left_output,right_output
Repeat
out.output = findSquareRoot(Input("number: "))
Cls
Text 0,0,out\oleft+"*sqr("+out\oright+")"
Flip
WaitKey()
Cls
Until KeyDown(1)

Type output		;type used to store all outputs of various funcitons I use...easier than using globals
	Field oleft,oright
End Type

Function findSquareRoot.output(num%)
	Local c_num = num
	Local c_prime = 1
	Local place = 0
	Local answers[50]
	Local left_answer = 1
	Local right_answer = 1
	
	Repeat
		c_prime = NextPrime(c_prime)
		If c_num = c_prime Then ;all done
			answers[place] = c_prime
			Exit
		ElseIf c_num Mod c_prime = 0 Then 
			answers[place] = c_prime
			place = place + 1
			c_num = c_num/c_prime
			c_prime = 1
		EndIf
	Forever
	
	For i = 0 To place
		For j = i+1 To place
			If answers[i] = -1 Or answers[j] = -1 Then 		;make sure we don't choose something already taken
			ElseIf answers[i] = answers[j] Then 
				left_answer = left_answer*answers[j]
		
				answers[j] = -1
				answers[i] = -1
				Exit
			ElseIf j = place Then 
				right_answer = right_answer*answers[i]
				answers[i] = -1
			EndIf
			Next
			If i = place Then 
				If answers[i] <> -1 Then right_answer = right_answer*answers[i]
			EndIf
	Next
	out.output = New output
	out\oleft = left_answer
	out\oright = right_answer
	Return out
End Function

;Prime number search function
Function NextPrime(current)
  Local i
  Local found=0

  While Not found
    current = current + 1 : found = True
    For i = 2 To current/2
      If (current Mod i) = 0 Then
        Found = False
        Exit
      EndIf
    Next
  Wend

  Return current
End Function