RosettaCodeData/Task/Pell-numbers/Go/pell-numbers.go

75 lines
1.7 KiB
Go

package main
import (
"fmt"
"math/big"
"rcu"
)
func main() {
p := make([]int64, 40)
p[1] = 1
for i := 2; i < 40; i++ {
p[i] = 2*p[i-1] + p[i-2]
}
fmt.Println("The first 20 Pell numbers are:")
fmt.Println(p[0:20])
q := make([]int64, 40)
q[0] = 2
q[1] = 2
for i := 2; i < 40; i++ {
q[i] = 2*q[i-1] + q[i-2]
}
fmt.Println("\nThe first 20 Pell-Lucas numbers are:")
fmt.Println(q[0:20])
fmt.Println("\nThe first 20 rational approximations of √2 (1.4142135623730951) are:")
for i := 1; i <= 20; i++ {
r := big.NewRat(q[i]/2, p[i])
fmt.Printf("%-17s ≈ %-18s\n", r, r.FloatString(16))
}
fmt.Println("\nThe first 15 Pell primes are:")
p0 := big.NewInt(0)
p1 := big.NewInt(1)
p2 := big.NewInt(0)
two := big.NewInt(2)
indices := make([]int, 15)
for index, count := 2, 0; count < 15; index++ {
p2.Mul(p1, two)
p2.Add(p2, p0)
if rcu.IsPrime(index) && p2.ProbablyPrime(15) {
fmt.Println(p2)
indices[count] = index
count++
}
p0.Set(p1)
p1.Set(p2)
}
fmt.Println("\nIndices of the first 15 Pell primes are:")
fmt.Println(indices)
fmt.Println("\nFirst 20 Newman-Shank_Williams numbers:")
nsw := make([]int64, 20)
for n := 0; n < 20; n++ {
nsw[n] = p[2*n] + p[2*n+1]
}
fmt.Println(nsw)
fmt.Println("\nFirst 20 near isosceles right triangles:")
u0 := 0
u1 := 1
sum := 1
for i := 2; i < 43; i++ {
u2 := u1*2 + u0
if i%2 == 1 {
fmt.Printf("(%d, %d, %d)\n", sum, sum+1, u2)
}
sum += u2
u0 = u1
u1 = u2
}
}