Square root by hand: Difference between revisions
(Added C# version) |
(Added Go) |
||
Line 30: | Line 30: | ||
}</lang>{{out}}<pre style="height:32ex; overflow:scroll; white-space:pre-wrap;">14142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372 |
}</lang>{{out}}<pre style="height:32ex; overflow:scroll; white-space:pre-wrap;">14142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372 |
||
Time taken for 500 digits: 00:00:00.0092331 |
Time taken for 500 digits: 00:00:00.0092331 |
||
</pre> |
|||
=={{header|Go}}== |
|||
{{trans|Visual Basic .NET}} |
|||
<lang go>package main |
|||
import ( |
|||
"fmt" |
|||
"math/big" |
|||
) |
|||
var one = big.NewInt(1) |
|||
var ten = big.NewInt(10) |
|||
var twenty = big.NewInt(20) |
|||
var hundred = big.NewInt(100) |
|||
func sqrt(n int64, limit int) { |
|||
i := big.NewInt(n) |
|||
j := new(big.Int).Sqrt(i) |
|||
k := new(big.Int).Set(j) |
|||
d := new(big.Int).Set(j) |
|||
t := new(big.Int) |
|||
digits := 0 |
|||
for digits < limit { |
|||
fmt.Print(d) |
|||
t.Mul(k, d) |
|||
i.Sub(i, t) |
|||
i.Mul(i, hundred) |
|||
k.Mul(j, twenty) |
|||
d.Set(one) |
|||
for d.Cmp(ten) <= 0 { |
|||
t.Add(k, d) |
|||
t.Mul(t, d) |
|||
if t.Cmp(i) > 0 { |
|||
d.Sub(d, one) |
|||
break |
|||
} |
|||
d.Add(d, one) |
|||
} |
|||
j.Mul(j, ten) |
|||
j.Add(j, d) |
|||
k.Add(k, d) |
|||
digits = digits + 1 |
|||
} |
|||
fmt.Println() |
|||
} |
|||
func main() { |
|||
sqrt(2, 480) // enough for demo purposes |
|||
}</lang> |
|||
{{out}} |
|||
<pre style="height:22ex; overflow:scroll; white-space:pre-wrap;"> |
|||
141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871 |
|||
</pre> |
</pre> |
||
Revision as of 20:40, 12 October 2020
Create a program that will calculate n digits of the square root of a number.
The program should continue forever (or until the number of digits is specified) calculating and outputting each decimal digit in succession. The program should be a "spigot algorithm" generating the digits of the number sequentially from left to right providing increasing precision as the algorithm proceeds.
C#
<lang csharp>using System; using static System.Math; using static System.Console; using BI = System.Numerics.BigInteger;
class Program {
static void Main(string[] args) { BI i, j, k, d; i = 2; int n = -1; int n0 = -1; j = (BI)Floor(Sqrt((double)i)); k = j; d = j; DateTime st = DateTime.Now; if (args.Length > 0) int.TryParse(args[0], out n); if (n > 0) n0 = n; else n = 1; do { Write(d); i = (i - k * d) * 100; k = 20 * j; for (d = 1; d <= 10; d++) if ((k + d) * d > i) { d -= 1; break; } j = j * 10 + d; k += d; if (n0 > 0) n--; } while (n > 0); if (n0 > 0) WriteLine("\nTime taken for {0} digits: {1}", n0, DateTime.Now - st); }
}</lang>
- Output:
14142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372Time taken for 500 digits: 00:00:00.0092331
Go
<lang go>package main
import (
"fmt" "math/big"
)
var one = big.NewInt(1) var ten = big.NewInt(10) var twenty = big.NewInt(20) var hundred = big.NewInt(100)
func sqrt(n int64, limit int) {
i := big.NewInt(n) j := new(big.Int).Sqrt(i) k := new(big.Int).Set(j) d := new(big.Int).Set(j) t := new(big.Int) digits := 0 for digits < limit { fmt.Print(d) t.Mul(k, d) i.Sub(i, t) i.Mul(i, hundred) k.Mul(j, twenty) d.Set(one) for d.Cmp(ten) <= 0 { t.Add(k, d) t.Mul(t, d) if t.Cmp(i) > 0 { d.Sub(d, one) break } d.Add(d, one) } j.Mul(j, ten) j.Add(j, d) k.Add(k, d) digits = digits + 1 } fmt.Println()
}
func main() {
sqrt(2, 480) // enough for demo purposes
}</lang>
- Output:
141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871
Visual Basic .NET
This is "spigot like", but not a true spigot, just an implementation of the "by hand" method of computing the square root, in this case, of two.<lang vbnet>Imports System.Math, System.Console, BI = System.Numerics.BigInteger
Module Module1
Sub Main(ByVal args As String()) Dim i, j, k, d As BI : i = 2 j = CType(Floor(Sqrt(CDbl(i))), BI) : k = j : d = j Dim n As Integer = -1, n0 As Integer = -1, st As DateTime = DateTime.Now If args.Length > 0 Then Integer.TryParse(args(0), n) If n > 0 Then n0 = n Else n = 1 Do Write(d) : i = (i - k * d) * 100 : k = 20 * j For d = 1 To 10 If (k + d) * d > i Then d -= 1 : Exit For Next j = j * 10 + d : k += d : If n0 > 0 Then n = n - 1 Loop While n > 0 If n0 > 0 Then WriteLine (VbLf & "Time taken for {0} digits: {1}", n0, DateTime.Now - st) End Sub
End Module</lang>
- Output:
Execute without any command line parameters for it to run until it crashes (due to BigInteger variables eating up available memory). Output with command line parameter of 500:
14142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372 Time taken for 500 digits: 00:00:00.0263710
Wren
<lang ecmascript>import "/big" for BigInt
var sqrt = Fn.new { |n, limit|
var i = BigInt.new(n) var j = i.isqrt var k = j var d = j var digits = 0 while (digits < limit) { System.write(d) i = (i - k*d) * 100 k = j * 20 d = BigInt.one while (d <= 10) { if ((k + d)*d > i) { d = d.dec break } d = d.inc } j = j*10 + d k = k + d digits = digits + 1 } System.print()
}
sqrt.call(2, 480) // enough for demo purposes</lang>
- Output:
141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871