# Programmer: Shafik Nagori
# File: pell.r
# Purpose: Generate Pell numbers, Fibonacci numbers, and √2 approximations
# Date: October 2025

# Initialize vectors
n <- 0:199
fib <- numeric(200)
pell <- numeric(200)
approx_sqrt2 <- numeric(200)
diff_sqrt2 <- numeric(200)
accuracy <- integer(200)

# Set initial values
fib[1] <- 0
fib[2] <- 1
pell[1] <- 0
pell[2] <- 1

# Generate Fibonacci and Pell numbers
for (i in 3:200) {
  fib[i] <- fib[i - 1] + fib[i - 2]
  pell[i] <- 2 * pell[i - 1] + pell[i - 2]
}

# Calculate approximations and differences
for (i in 1:200) {
  if (fib[i] != 0) {
    approx_sqrt2[i] <- pell[i] / fib[i]
    diff_sqrt2[i] <- round(abs(sqrt(2) - approx_sqrt2[i]), 5)
    
    # Accuracy: count matching decimal places
    true_val <- format(sqrt(2), digits = 15)
    approx_val <- format(approx_sqrt2[i], digits = 15)
    match <- 0
    for (j in 1:nchar(true_val)) {
      if (substr(true_val, j, j) == substr(approx_val, j, j)) {
        match <- match + 1
      } else {
        break
      }
    }
    accuracy[i] <- match - 2  # subtract "1." before decimals
  } else {
    approx_sqrt2[i] <- NA
    diff_sqrt2[i] <- NA
    accuracy[i] <- NA
  }
}

# Create dataframe
pelldata <- data.frame(
  Index = n,
  Fibonacci = fib,
  Pell = pell,
  ApproxSqrt2 = approx_sqrt2,
  DiffToSqrt2 = diff_sqrt2,
  AccuracyDP = accuracy
)

# Display first few rows
head(pelldata)
