Math-PlanePath

 view release on metacpan or  search on metacpan

devel/r5-dragon.pl  view on Meta::CPAN

    @non_values = sort {$a<=>$b} @non_values;
    my $count = scalar(@n_values);
    print "count $count\n";

    # push @values, $count;
    @values = @n_values;

    if ($k <= 4) {
      foreach my $n (@non_values) {
        my $pred = $path->_UNDOCUMENTED__n_segment_is_left_boundary($n);
        my $diff = $pred ? '  ***' : '';
        my $n5 = Math::BaseCnv::cnv($n,10,5);
        print "non $n  $n5$diff\n";
      }
    }
    # @values = @non_values;

    # print "func ";
    # foreach my $i (0 .. $count-1) {
    #   my $n = $path->_UNDOCUMENTED__left_boundary_i_to_n($i);
    #   my $n5 = Math::BaseCnv::cnv($n,10,5);
    #   print "$n,";
    # }
    # print "\n";

    print "vals ";
    foreach my $i (0 .. $count-1) {
      my $n = $values[$i];
      my $n5 = Math::BaseCnv::cnv($n,10,5);
      print "$n5,";
    }
    print "\n";
  }

  # @values = MyOEIS::first_differences(@values);
  shift @values;
  shift @values;
  shift @values;
  print join(',',@values),"\n";
  Math::OEIS::Grep->search(array => \@values);
  exit 0;
}


{
  # recurrence
  # v3 = a*v0 + b*v1 + c*v2
  #  [v0 v1 v2] [a]   [v3]
  #  [v1 v2 v3] [b] = [v4]
  #  [v2 v3 v4] [c]   [v5]
  #  [a]   [v0 v1 v2] -1   [v1]
  #  [b] = [v1 v2 v3]    * [v2]
  #  [c]   [v2 v3 v4]      [v3]

  $|=1;
  my @array = (
54,90,150,250,422,714,1206,2042,3462
              );
  # @array = ();
  # foreach my $k (5 .. 10) {
  #   push @array, R_formula(2*$k+1);
  # }
  # require MyOEIS;
  # my $path = Math::PlanePath::R5DragonCurve->new;
  # foreach my $k (0 .. 30) {
  #   my $value = MyOEIS::path_boundary_length($path, 5**$k,
  #                                            # side => 'left',
  #                                           );
  #   last if $value > 10_000;
  #   push @array, $value;
  #   print "$value,";
  # }
  print "\n";
  array_to_recurrence_pari(\@array);
  print "\n";
  my @recurr = array_to_recurrence(\@array);
  print join(', ',@recurr),"\n";
  exit 0;

  sub array_to_recurrence_pari {
    my ($aref) = @_;
    my $order = int(scalar(@array)/2); # 2*order-1 = @array-1
    my $str = "m=[";
    foreach my $i (0 .. $order-1) {
      if ($i) { $str .= "; " }
      foreach my $j (0 .. $order-1) {
        if ($j) { $str .= "," }
        $str .= $aref->[$i+$j];
      }
    }
    $str .= "]\n";
    $str .= "v=[";
    foreach my $i ($order .. 2*$order-1) {
      if ($i > $order) { $str .= ";" }
      $str .= $aref->[$i];
    }
    $str .= "];";
    $str .= "(m^-1)*v\n";
    print $str;
    require IPC::Run;
    IPC::Run::run(['gp'],'<',\$str);
  }
  sub array_to_recurrence {
    my ($aref) = @_;
    # 2*order-1 = @array-1
    my $order = int(scalar(@array)/2);
    require Math::Matrix;
    my $m = Math::Matrix->new(map {[
                                    map { $array[$_]
                                        } $_ .. $_+$order-1
                                   ]}
                              0 .. $order-1);
    print $m;
    print $m->determinant,"\n";

    my $v = Math::Matrix->new(map {[ $array[$_] ]} $order .. 2*$order-1);
    print $v;

    $m = $m->invert;
    print $m;

devel/r5-dragon.pl  view on Meta::CPAN

                                             $w2/$xscale, $h2/$yscale);
  print "n to $n_hi\n";
  foreach my $n ($n_lo .. $n_hi) {
    next if ($n % 5) == 2;
    my ($x,$y) = $path->n_to_xy($n);
    my ($next_x,$next_y) = $path->n_to_xy($n+1);
    foreach (1 .. 4) {
      $image->line ($affine->($x,$y),
                    $affine->($next_x,$next_y),
                    ($x==$next_x ? '|' : '-'));

      $image->xy ($affine->($x,$y),
                  '+');
      $image->xy ($affine->($next_x,$next_y),
                  '+');

      ($x,$y) = (-$y,$x); # rotate +90
      ($next_x,$next_y) = (-$next_y,$next_x); # rotate +90
    }
  }
  $image->xy ($affine->(0,0),
              'o');

  foreach my $x (0 .. $width-1) {
    foreach my $y (0 .. $height-1) {
      next unless $image->xy($x,$y) eq '+';

      if ($x > 0 && $image->xy($x-1,$y) eq ' ') {
        $image->xy($x,$y, '|');
      } elsif ($x < $width-1 && $image->xy($x+1,$y) eq ' ') {
        $image->xy($x,$y, '|');

      } elsif ($y > 0 && $image->xy($x,$y-1) eq ' ') {
        $image->xy($x,$y, '-');
      } elsif ($y < $height-1 && $image->xy($x,$y+1) eq ' ') {
        $image->xy($x,$y, '-');
      }
    }
  }
  $image->save('/dev/stdout');
  exit 0;
}
{
  # area recurrence
  foreach my $i (0 .. 10) {
    print recurrence($i),",";
  }
  print "\n";

  print "wrong():              ";
  foreach my $i (0 .. 10) { print wrong($i),","; }
  print "\n";

  print "recurrence_area815(): ";
  foreach my $i (0 .. 10) { print recurrence_area815($i),","; }
  print "\n";

  print "recurrence_area43():  ";
  foreach my $i (0 .. 10) { print recurrence_area43($i),","; }
  print "\n";
  print "formula_pow():        ";
  foreach my $i (0 .. 10) { print formula_pow($i),","; }
  print "\n";

  print "recurrence_areaSU():  ";
  foreach my $i (0 .. 10) { print recurrence_areaSU($i),","; }
  print "\n";
  print "recurrence_area2S():  ";
  foreach my $i (0 .. 10) { print recurrence_area2S($i),","; }
  print "\n";
  exit 0;

  # A[n+1] = 4*A[n] - 3*A[n-1] + 4*5^(n-1)
  # - A[n+1] + 4*A[n] + 4*5^(n-1) = 3*A[n-1]
  # 3*A[n-1] = - A[n+1] + 4*A[n] + 4*5^(n-1)
  # 3*A[n-2] = - A[n] + 4*A[n-1] + 4*5^(n-2)

  # D[n+1] = 4*A[n] - 3*A[n-1]            + 4*5^(n-1)
  #          -       (4*A[n-1] - 3*A[n-2] + 4*5^(n-2))
  #        = 4*A[n] - 3*A[n-1]            + 4*5^(n-1)
  #                 - 4*A[n-1] + 3*A[n-2] - 4*5^(n-2))
  #        = 4*A[n] - 3*A[n-1]            + 4*5^(n-1)
  #                 - 4*A[n-1] - A[n] + 4*A[n-1] + 4*5^(n-2) - 4*5^(n-2))
  #        = 4*A[n] - 3*A[n-1]            + 4*5^(n-1)
  #          - A[n]
  # D[n+1] = 4*A[n] - 3*A[n-1]            + 4*5^(n-1)
  #          - A[n]
  # D[n+1] = 3*A[n] - 3*A[n-1]            + 4*5^(n-1)
  # D[n+1] = 3*D[n] + 4*5^(n-1)

  #      = 4*A[n] - 7*A[n-1] + 3*A[n-2] + (4*5-4)*5^(n-2)
  #      = 4*A[n] - 7*A[n-1] + 3*A[n-2] + 16*5^(n-2)
  #      = 4*A[n] - 7*A[n-1] + A[n] + 4*A[n-1] + 4*5^(n-2) + 16*5^(n-2)
  #      = 3*A[n] - 3*A[n-1] + 20*5^(n-2)
  # 4*A[n] - 12*A[n-1] + 4 - 4*5^(n-1) = 0 ??

  sub wrong {
    my ($n) = @_;
    if ($n <= 0) { return 0; }
    if ($n == 1) { return 0; }
    return 4*wrong($n-1) + 4*5**($n-2);
  }


  # A[n] = (5^k - 2*3^k + 1)/2
  sub formula_pow {
    my ($n) = @_;
    return (5**$n - 2*3**$n + 1) / 2;
  }

  sub recurrence_area43 {
    my ($n) = @_;
    if ($n <= 0) { return 0; }
    if ($n == 1) { return 0; }
    return 4*recurrence_area43($n-1) - 3*recurrence_area43($n-2) + 4*5**($n-2);
  }

  # A[n+1] = 8*A[n] - 15*A[n-1] + 4
  sub recurrence_area815 {
    my ($n) = @_;
    if ($n <= 0) { return 0; }
    if ($n == 1) { return 0; }
    return 8*recurrence_area815($n-1) - 15*recurrence_area815($n-2) + 4;
  }
  sub recurrence {
    my ($n) = @_;
    if ($n <= 0) { return 0; }
    if ($n == 1) { return 2; }
    return 8*recurrence($n-1) - 15*recurrence($n-2) + 2;
  }

  sub recurrence_area2S {
    my ($n) = @_;
    return 2*recurrence_S($n+1);
  }
  sub recurrence_areaSU {
    my ($n) = @_;
    return 4*recurrence_S($n) + 2*recurrence_U($n);
  }
  sub recurrence_S {
    my ($n) = @_;
    if ($n <= 0) { return 0; }
    if ($n == 1) { return 0; }
    return 2*recurrence_S($n-1) + recurrence_U($n-1);
  }
  sub recurrence_U {
    my ($n) = @_;
    if ($n <= 0) { return 0; }
    if ($n == 1) { return 0; }
    return recurrence_S($n-1) + 2*recurrence_U($n-1) + 2*5**($n-2);
  }

  # A(n)=a(n)*2
  # A(n)/2 = 8*A(n-1)/2 - 15*A(n-2)/2 + 2
  # A(n) = 8*A(n-1) - 15*A(n-2) + 4
}
{
  # arm xy modulus
  require Math::PlanePath::R5DragonMidpoint;
  my $path = Math::PlanePath::R5DragonMidpoint->new (arms => 4);

  my %dxdy_to_digit;
  my %seen;
  for (my $n = 0; $n < 6125; $n++) {
    my $digit = $n % 5;



( run in 0.843 second using v1.01-cache-2.11-cpan-df04353d9ac )