Metallic ratios: Difference between revisions
Content added Content deleted
Line 1,559: | Line 1,559: | ||
Reached after 616 iterations |
Reached after 616 iterations |
||
</pre> |
</pre> |
||
=={{header|Visual Basic .NET}}== |
|||
{{trans|C#}} |
|||
<lang vbnet>Imports BI = System.Numerics.BigInteger |
|||
Module Module1 |
|||
Function IntSqRoot(v As BI, res As BI) As BI |
|||
REM res is the initial guess |
|||
Dim term As BI = 0 |
|||
Dim d As BI = 0 |
|||
Dim dl As BI = 1 |
|||
While dl <> d |
|||
term = v / res |
|||
res = (res + term) >> 1 |
|||
dl = d |
|||
d = term - res |
|||
End While |
|||
Return term |
|||
End Function |
|||
Function DoOne(b As Integer, digs As Integer) As String |
|||
REM calculates result via square root, not iterations |
|||
Dim s = b * b + 4 |
|||
digs += 1 |
|||
Dim g As BI = Math.Sqrt(s * Math.Pow(10, digs)) |
|||
Dim bs = IntSqRoot(s * BI.Parse("1" + New String("0", digs << 1)), g) |
|||
bs += b * BI.Parse("1" + New String("0", digs)) |
|||
bs >>= 1 |
|||
bs += 4 |
|||
Dim st = bs.ToString |
|||
digs -= 1 |
|||
Return String.Format("{0}.{1}", st(0), st.Substring(1, digs)) |
|||
End Function |
|||
Function DivIt(a As BI, b As BI, digs As Integer) As String |
|||
REM performs division |
|||
Dim al = a.ToString.Length |
|||
Dim bl = b.ToString.Length |
|||
digs += 1 |
|||
a *= BI.Pow(10, digs << 1) |
|||
b *= BI.Pow(10, digs) |
|||
Dim s = (a / b + 5).ToString |
|||
digs -= 1 |
|||
Return s(0) + "." + s.Substring(1, digs) |
|||
End Function |
|||
REM custom formatting |
|||
Function Joined(x() As BI) As String |
|||
Dim wids() = {1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13} |
|||
Dim res = "" |
|||
For i = 0 To x.Length - 1 |
|||
res += String.Format("{0," + (-wids(i)).ToString + "} ", x(i)) |
|||
Next |
|||
Return res |
|||
End Function |
|||
Sub Main() |
|||
REM calculates and checks each "metal" |
|||
Console.WriteLine("Metal B Sq.Rt Iters /---- 32 decimal place value ----\\ Matches Sq.Rt Calc") |
|||
Dim t = "" |
|||
Dim n As BI |
|||
Dim nm1 As BI |
|||
Dim k As Integer |
|||
Dim j As Integer |
|||
For b = 0 To 9 |
|||
Dim lst(14) As BI |
|||
lst(0) = 1 |
|||
lst(1) = 1 |
|||
For i = 2 To 14 |
|||
lst(i) = b * lst(i - 1) + lst(i - 2) |
|||
Next |
|||
REM since all the iterations (except Pt) are > 15, continue iterating from the end of the list of 15 |
|||
n = lst(14) |
|||
nm1 = lst(13) |
|||
k = 0 |
|||
j = 13 |
|||
While k = 0 |
|||
Dim lt = t |
|||
t = DivIt(n, nm1, 32) |
|||
If lt = t Then |
|||
k = If(b = 0, 1, j) |
|||
End If |
|||
Dim onn = n |
|||
n = b * n + nm1 |
|||
nm1 = onn |
|||
j += 1 |
|||
End While |
|||
Console.WriteLine("{0,4} {1} {2,2} {3, 2} {4} {5}" + vbNewLine + "{6,19} {7}", "Pt Au Ag CuSn Cu Ni Al Fe Sn Pb".Split(" ")(b), b, b * b + 4, k, t, t = DoOne(b, 32), "", Joined(lst)) |
|||
Next |
|||
REM now calculate and check big one |
|||
n = 1 |
|||
nm1 = 1 |
|||
k = 0 |
|||
j = 1 |
|||
While k = 0 |
|||
Dim lt = t |
|||
t = DivIt(n, nm1, 256) |
|||
If lt = t Then |
|||
k = j |
|||
End If |
|||
Dim onn = n |
|||
n += nm1 |
|||
nm1 = onn |
|||
j += 1 |
|||
End While |
|||
Console.WriteLine() |
|||
Console.WriteLine("Au to 256 digits:") |
|||
Console.WriteLine(t) |
|||
Console.WriteLine("Iteration count: {0} Matched Sq.Rt Calc: {1}", k, t = DoOne(1, 256)) |
|||
End Sub |
|||
End Module</lang> |
|||
{{out}} |
|||
<pre>Metal B Sq.Rt Iters /---- 32 decimal place value ----\\ Matches Sq.Rt Calc |
|||
Pt 0 4 1 1.00000000000000000000000000000000 True |
|||
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 |
|||
Au 1 5 78 1.61803398874989484820458683436564 True |
|||
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 |
|||
Ag 2 8 44 2.41421356237309504880168872420970 True |
|||
1 1 3 7 17 41 99 239 577 1393 3363 8119 19601 47321 114243 |
|||
CuSn 3 13 34 3.30277563773199464655961063373525 True |
|||
1 1 4 13 43 142 469 1549 5116 16897 55807 184318 608761 2010601 6640564 |
|||
Cu 4 20 28 4.23606797749978969640917366873128 True |
|||
1 1 5 21 89 377 1597 6765 28657 121393 514229 2178309 9227465 39088169 165580141 |
|||
Ni 5 29 25 5.19258240356725201562535524577016 True |
|||
1 1 6 31 161 836 4341 22541 117046 607771 3155901 16387276 85092281 441848681 2294335686 |
|||
Al 6 40 23 6.16227766016837933199889354443272 True |
|||
1 1 7 43 265 1633 10063 62011 382129 2354785 14510839 89419819 551029753 3395598337 20924619775 |
|||
Fe 7 53 22 7.14005494464025913554865124576352 True |
|||
1 1 8 57 407 2906 20749 148149 1057792 7552693 53926643 385039194 2749201001 19629446201 140155324408 |
|||
Sn 8 68 20 8.12310562561766054982140985597408 True |
|||
1 1 9 73 593 4817 39129 317849 2581921 20973217 170367657 1383914473 11241683441 91317382001 741780739449 |
|||
Pb 9 85 20 9.10977222864644365500113714088140 True |
|||
1 1 10 91 829 7552 68797 626725 5709322 52010623 473804929 4316254984 39320099785 358197153049 3263094477226 |
|||
Au to 256 digits: |
|||
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911374847540880753868917521266338622235369317931800607667263544333890865959395829056383226613199282902678806752087668925017116962070322210432162695486262963136144 |
|||
Iteration count: 616 Matched Sq.Rt Calc: True</pre> |
|||
=={{header|Wren}}== |
=={{header|Wren}}== |