The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# Copyright 2011, 2012 Kevin Ryde

# This file is part of Math-NumSeq.
#
# Math-NumSeq is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3, or (at your option) any later
# version.
#
# Math-NumSeq is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with Math-NumSeq.  If not, see <http://www.gnu.org/licenses/>.

require 5;
use strict;
use Math::BigInt try => 'GMP';

# uncomment this to run the ### lines
use Smart::Comments;

{
  # non-decreasing

  require Math::NumSeq::SqrtEngel;
  require Math::NumSeq::Squares;
  foreach my $sqrt (2 .. 10000) {
    next if (Math::NumSeq::Squares->pred($sqrt));
    print "$sqrt\n";

    my $seq = Math::NumSeq::SqrtEngel->new (sqrt => $sqrt);
    my ($prev_i, $prev_value) = $seq->next;
    my $same = 0;
    my @values = ($prev_value);
    for (;;) {
      my ($i, $value) = $seq->next or last;
      push @values, $value;
      $same ||= ($value == $prev_value && $value != 1);
      if ($value < $prev_value) {
        die "$sqrt decreasing i=$i";
      }
      last if $value > 1_000_000;
    }
    while (@values && $values[0] == 1) {
      shift @values;
    }
    if ($same) {
      my $values = join(',',@values);
      print "$sqrt same: $values\n";
    }
  }
  exit 0;
}

{
  # A028254
  # x(1)=sqrt(2), a(n) = ceil(1/x(n)), x(n+1) = x(n)a(n)-1.

  my $r = 2;
  my $x = Math::BigInt->new(0);
  my $y = Math::BigInt->new(1);
  for (1 .. 20) {
    # my $f = 1/ (sqrt($r*$y*$y) - $x);
    my $num = (sqrt($r*$y*$y) + $x);
    my $den = ($r*$y*$y - $x*$x);
    my $n = (sqrt($r*$y*$y) + $x) / ($r*$y*$y - $x*$x);
    $x = $x*$n + 1;
    $y *= $n;
    print "$n = $num/$den  new $x / $y\n";
    ### assert: $x <= sqrt($r*$y*$y)
  }
  exit 0;
}