Triangular numbers: Difference between revisions
m (→{{header|Julia}}: spacing) |
(Added Wren) |
||
Line 240: | Line 240: | ||
tetrahedral-root: 44355.777384073256052620916903 |
tetrahedral-root: 44355.777384073256052620916903 |
||
pentatopic-root: 4321</pre> |
pentatopic-root: 4321</pre> |
||
=={{header|Wren}}== |
|||
{{libheader|Wren-fmt}} |
|||
{{libheader|Wren-big}} |
|||
<syntaxhighlight lang="ecmascript">import "./fmt" for Fmt |
|||
import "./big" for BigRat |
|||
var t = List.filled(30, 0) |
|||
for (n in 1..29) t[n] = t[n-1] + n |
|||
System.print("The first 30 triangular numbers are:") |
|||
Fmt.tprint("$3d", t, 6) |
|||
for (n in 1..29) t[n] = t[n] + t[n-1] |
|||
System.print("\nThe first 30 tetrahedral numbers are:") |
|||
Fmt.tprint("$4d", t, 6) |
|||
for (n in 1..29) t[n] = t[n] + t[n-1] |
|||
System.print("\nThe first 30 pentatopic numbers are:") |
|||
Fmt.tprint("$5d", t, 6) |
|||
for (r in 5..12) { |
|||
for (n in 1..29) t[n] = t[n] + t[n-1] |
|||
} |
|||
System.print("\nThe first 30 12-simplex numbers are:") |
|||
Fmt.tprint("$10d", t, 6) |
|||
var xs = [7140, 21408696, 26728085384, 14545501785001] |
|||
var digs = 16 |
|||
for (x in xs) { |
|||
var bx = BigRat.new(x) |
|||
System.print("\nRoots of %(x):") |
|||
var root = ((bx*8 + 1).sqrt(digs) - 1)/2 |
|||
Fmt.print("$14s: $s", "triangular", root.toDecimal(digs-5)) |
|||
var temp = (bx*bx*9 - BigRat.new(1, 27)).sqrt(digs) |
|||
root = (bx*3 + temp).cbrt(digs) + (bx*3 - temp).cbrt(digs) - 1 |
|||
Fmt.print("$14s: $s", "tetrahedral", root.toDecimal(digs-5)) |
|||
root = (((bx*24 + 1).sqrt(digs)*4 + 5).sqrt(digs) - 3) / 2 |
|||
Fmt.print("$14s: $s", "pentatopic", root.toDecimal(digs-5)) |
|||
}</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
The first 30 triangular numbers are: |
|||
0 1 3 6 10 15 |
|||
21 28 36 45 55 66 |
|||
78 91 105 120 136 153 |
|||
171 190 210 231 253 276 |
|||
300 325 351 378 406 435 |
|||
The first 30 tetrahedral numbers are: |
|||
0 1 4 10 20 35 |
|||
56 84 120 165 220 286 |
|||
364 455 560 680 816 969 |
|||
1140 1330 1540 1771 2024 2300 |
|||
2600 2925 3276 3654 4060 4495 |
|||
The first 30 pentatopic numbers are: |
|||
0 1 5 15 35 70 |
|||
126 210 330 495 715 1001 |
|||
1365 1820 2380 3060 3876 4845 |
|||
5985 7315 8855 10626 12650 14950 |
|||
17550 20475 23751 27405 31465 35960 |
|||
The first 30 12-simplex numbers are: |
|||
0 1 13 91 455 1820 |
|||
6188 18564 50388 125970 293930 646646 |
|||
1352078 2704156 5200300 9657700 17383860 30421755 |
|||
51895935 86493225 141120525 225792840 354817320 548354040 |
|||
834451800 1251677700 1852482996 2707475148 3910797436 5586853480 |
|||
Roots of 7140: |
|||
triangular: 119 |
|||
tetrahedral: 34.00000000000 |
|||
pentatopic: 18.87664661593 |
|||
Roots of 21408696: |
|||
triangular: 6543 |
|||
tetrahedral: 503.56182697464 |
|||
pentatopic: 149.06094737527 |
|||
Roots of 26728085384: |
|||
triangular: 231205.40556525584 |
|||
tetrahedral: 5432.00000000000 |
|||
pentatopic: 893.44245675168 |
|||
Roots of 14545501785001: |
|||
triangular: 5393607.15814517232 |
|||
tetrahedral: 44355.77738407326 |
|||
pentatopic: 4321 |
|||
</pre> |
Revision as of 10:51, 10 February 2023
A triangular number is a count of objects arranged into an equilateral triangle. Much like how a square number is a count of objects arranged into a square.
The nth triangular number is the sum of the first n non-negative integers.
Triangular numbers may be calculated by the following explicit formulas:
where is the binomial coefficient "n plus one choose two".
Analogous to square roots, we may also calculate a triangular root. Numbers that have an integer triangular
root are triangular numbers.
The real triangular root of a number may be found using:
Similar to how cubic numbers are square numbers extended into a third dimension, triangular numbers extended into a third dimension are known as tetrahedral numbers.
The nth tetrahedral number is the sum of the first n triangular numbers.
Or, may be calculated directly: (Binomial "n plus two choose three".)
One may find the real tetrahedral root using the formula:
Depending on the math precision of your particular language, may need to be rounded to the nearest 1e-16 or so.
Extending into a fourth dimension we get pentatopic numbers.
Again, the nth pentatope is the sum of the first n tetrahedral numbers, or (Binomial "n plus three choose four".)
Pentatopic real roots may be found using:
In general, these all belong to the class figurate numbers as they are
based on r dimensional figures. Sometimes they are referred to as r-simplex
numbers. In geometry a simplex is the simplest r-dimensional
object possible.
You may easily extend to an arbitrary dimension r using binomials. Each term n in dimension r is
There is no known general formula to find roots of higher r-simplex numbers.
- Task
- Find and display the first 30 triangular numbers (r = 2).
- Find and display the first 30 tetrahedral numbers (r = 3).
- Find and display the first 30 pentatopic numbers (r = 4).
- Find and display the first 30 12-simplex numbers (r = 12).
- Find and display the triangular root, the tetrahedral root, and the pentatopic root for the integers:
- 7140
- 21408696
- 26728085384
- 14545501785001
- See also
- Wikipedia: Triangular numbers
- Wikipedia: Tetrahedral numbers
- Wikipedia: Pentatopic_numbers
- Wikipedia: Figurate numbers
- Wikipedia: Simplex(geometry)
- OEIS:A000217 - Triangular numbers: a(n) = binomial(n+1,2)
- OEIS:A000292 - Tetrahedral numbers: a(n) = binomial(n+2,3)
- OEIS:A000332 - Pentatope numbers: a(n) = binomial(n+3,4)
- Related task: Evaluate binomial coefficients
- Related task: Pascal's triangle
Julia
""" rosettacode.org task Triangular_numbers """
polytopic(r, range) = map(n -> binomial(n + r - 1, r), range)
triangular_root(x) = (sqrt(8x + 1) - 1) / 2
function tetrahedral_root(x)
return Float64(round((3x + sqrt(9 * big(x)^2 - 1/27))^(1/3) +
(3x - sqrt(9 * big(x)^2 - 1/27))^(1/3) - 1, digits=11))
end
pentatopic_root(x) = (sqrt(5 + 4 * sqrt(24x + 1)) - 3) / 2
function valuelisting(a, N=6)
c = maximum(length, string.(a)) + 1
return join([join([lpad(x, c) for x in v]) for v in Iterators.partition(a, N)], "\n")
end
for (r, name) in [[2, "triangular"], [3, "tetrahedral"], [4, "pentatopic"], [12, "12-simplex"]]
println("\nFirst 30 $name numbers:\n", valuelisting(polytopic(r, 0:29)))
end
for n in [7140, 21408696, 26728085384, 14545501785001]
println("\nRoots of $n:")
println(" triangular-root: ", triangular_root(n))
println(" tetrahedral-root: ", tetrahedral_root(n))
println(" pentatopic-root: ", pentatopic_root(n))
end
- Output:
First 30 triangular numbers: 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 First 30 tetrahedral numbers: 0 1 4 10 20 35 56 84 120 165 220 286 364 455 560 680 816 969 1140 1330 1540 1771 2024 2300 2600 2925 3276 3654 4060 4495 First 30 pentatopic numbers: 0 1 5 15 35 70 126 210 330 495 715 1001 1365 1820 2380 3060 3876 4845 5985 7315 8855 10626 12650 14950 17550 20475 23751 27405 31465 35960 First 30 12-simplex numbers: 0 1 13 91 455 1820 6188 18564 50388 125970 293930 646646 1352078 2704156 5200300 9657700 17383860 30421755 51895935 86493225 141120525 225792840 354817320 548354040 834451800 1251677700 1852482996 2707475148 3910797436 5586853480 Roots of 7140: triangular-root: 119.0 tetrahedral-root: 34.0 pentatopic-root: 18.876646615928006 Roots of 21408696: triangular-root: 6543.0 tetrahedral-root: 503.56182697464 pentatopic-root: 149.06094737526587 Roots of 26728085384: triangular-root: 231205.40556525585 tetrahedral-root: 5432.0 pentatopic-root: 893.4424567516849 Roots of 14545501785001: triangular-root: 5.3936071581451725e6 tetrahedral-root: 44355.77738407323 pentatopic-root: 4321.0
Raku
use Math::Root;
my \ε = FatRat.new: 1, 10**24;
sub binomial { [×] ($^n … 0) Z/ 1 .. $^p }
sub polytopic (Int $r, @range) { @range.map: { binomial $_ + $r - 1, $r } }
sub triangular-root ($x) { round ((8 × $x + 1).&root - 1) / 2, ε }
sub tetrahedral-root ($x) {
((3 × $x + (9 × $x² - 1/27).&root).&root(3) +
(3 × $x - (9 × $x² - 1/27).&root).&root(3) - 1).round: ε
}
sub pentatopic-root ($x) { round ((5 + 4 × (24 × $x + 1).&root).&root - 3) / 2, ε }
sub display (@values) {
my $c = @values.max.chars;
@values.batch(6)».fmt("%{$c}d").join: "\n";
}
for 2, 'triangular', 3, 'tetrahedral', 4, 'pentatopic', 12, '12-simplex'
-> $r, $name { say "\nFirst 30 $name numbers:\n" ~ display polytopic $r, ^30 }
say '';
for 7140, 21408696, 26728085384, 14545501785001 {
say qq:to/R/;
Roots of $_:
triangular-root: {.&triangular-root}
tetrahedral-root: {.&tetrahedral-root}
pentatopic-root: {.&pentatopic-root}
R
}
- Output:
First 30 triangular numbers: 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 First 30 tetrahedral numbers: 0 1 4 10 20 35 56 84 120 165 220 286 364 455 560 680 816 969 1140 1330 1540 1771 2024 2300 2600 2925 3276 3654 4060 4495 First 30 pentatopic numbers: 0 1 5 15 35 70 126 210 330 495 715 1001 1365 1820 2380 3060 3876 4845 5985 7315 8855 10626 12650 14950 17550 20475 23751 27405 31465 35960 First 30 12-simplex numbers: 0 1 13 91 455 1820 6188 18564 50388 125970 293930 646646 1352078 2704156 5200300 9657700 17383860 30421755 51895935 86493225 141120525 225792840 354817320 548354040 834451800 1251677700 1852482996 2707475148 3910797436 5586853480 Roots of 7140: triangular-root: 119 tetrahedral-root: 34 pentatopic-root: 18.876646615928006607901783 Roots of 21408696: triangular-root: 6543 tetrahedral-root: 503.56182697463651404819613 pentatopic-root: 149.060947375265867484387575 Roots of 26728085384: triangular-root: 231205.405565255836957291031961 tetrahedral-root: 5432 pentatopic-root: 893.442456751684869888466212 Roots of 14545501785001: triangular-root: 5393607.158145172316497304724655 tetrahedral-root: 44355.777384073256052620916903 pentatopic-root: 4321
Wren
import "./fmt" for Fmt
import "./big" for BigRat
var t = List.filled(30, 0)
for (n in 1..29) t[n] = t[n-1] + n
System.print("The first 30 triangular numbers are:")
Fmt.tprint("$3d", t, 6)
for (n in 1..29) t[n] = t[n] + t[n-1]
System.print("\nThe first 30 tetrahedral numbers are:")
Fmt.tprint("$4d", t, 6)
for (n in 1..29) t[n] = t[n] + t[n-1]
System.print("\nThe first 30 pentatopic numbers are:")
Fmt.tprint("$5d", t, 6)
for (r in 5..12) {
for (n in 1..29) t[n] = t[n] + t[n-1]
}
System.print("\nThe first 30 12-simplex numbers are:")
Fmt.tprint("$10d", t, 6)
var xs = [7140, 21408696, 26728085384, 14545501785001]
var digs = 16
for (x in xs) {
var bx = BigRat.new(x)
System.print("\nRoots of %(x):")
var root = ((bx*8 + 1).sqrt(digs) - 1)/2
Fmt.print("$14s: $s", "triangular", root.toDecimal(digs-5))
var temp = (bx*bx*9 - BigRat.new(1, 27)).sqrt(digs)
root = (bx*3 + temp).cbrt(digs) + (bx*3 - temp).cbrt(digs) - 1
Fmt.print("$14s: $s", "tetrahedral", root.toDecimal(digs-5))
root = (((bx*24 + 1).sqrt(digs)*4 + 5).sqrt(digs) - 3) / 2
Fmt.print("$14s: $s", "pentatopic", root.toDecimal(digs-5))
}
- Output:
The first 30 triangular numbers are: 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 The first 30 tetrahedral numbers are: 0 1 4 10 20 35 56 84 120 165 220 286 364 455 560 680 816 969 1140 1330 1540 1771 2024 2300 2600 2925 3276 3654 4060 4495 The first 30 pentatopic numbers are: 0 1 5 15 35 70 126 210 330 495 715 1001 1365 1820 2380 3060 3876 4845 5985 7315 8855 10626 12650 14950 17550 20475 23751 27405 31465 35960 The first 30 12-simplex numbers are: 0 1 13 91 455 1820 6188 18564 50388 125970 293930 646646 1352078 2704156 5200300 9657700 17383860 30421755 51895935 86493225 141120525 225792840 354817320 548354040 834451800 1251677700 1852482996 2707475148 3910797436 5586853480 Roots of 7140: triangular: 119 tetrahedral: 34.00000000000 pentatopic: 18.87664661593 Roots of 21408696: triangular: 6543 tetrahedral: 503.56182697464 pentatopic: 149.06094737527 Roots of 26728085384: triangular: 231205.40556525584 tetrahedral: 5432.00000000000 pentatopic: 893.44245675168 Roots of 14545501785001: triangular: 5393607.15814517232 tetrahedral: 44355.77738407326 pentatopic: 4321