Math-NumSeq

 view release on metacpan or  search on metacpan

xt/oeis/SternDiatomic-oeis.t  view on Meta::CPAN

   func => sub {
     my ($count) = @_;
     my $seq = Math::NumSeq::SternDiatomic->new;
     my @got;
     OUTER: for (my $k = 0; @got < $count; $k++) {
       foreach my $n (1 .. 2**$k) {
         @got < $count or last OUTER;
         push @got, $seq->ith($n)
       }
       foreach my $n (reverse 1 .. 2**$k-1) {
         @got < $count or last OUTER;
         push @got, $seq->ith($n)
       }
     }
     return \@got;
   });

# GP-DEFINE  A337277_row(n) = {
# GP-DEFINE    my(v=[1],upto=0);
# GP-DEFINE    for(i=1,n,
# GP-DEFINE      my(new=vector(2*#v+1),upto=0);
# GP-DEFINE      new[upto++] = 1;
# GP-DEFINE      for(j=1,#v,
# GP-DEFINE        new[upto++] = v[j];
# GP-DEFINE        if(j<#v, new[upto++] = v[j] + v[j+1]));
# GP-DEFINE      new[upto++] = 1;
# GP-DEFINE      upto==#new || error();
# GP-DEFINE      v=new);
# GP-DEFINE    v;
# GP-DEFINE  }
# GP-Test  A337277_row(0) == [1]
# GP-Test  A337277_row(1) == [1,1,1]
# GP-Test  A337277_row(2) == [1, 1, 2, 1, 2, 1, 1]
# GP-Test  A337277_row(3) == [1, 1, 2, 1, 3, 2, 3, 1, 3, 2, 3, 1, 2, 1, 1]
# GP-Test  A337277_row(4) == [1, 1, 2, 1, 3, 2, 3, 1, 4, 3, 5, 2, 5, 3, 4, \
# GP-Test                     1, 4, 3, 5, 2, 5, 3, 4, 1, 3, 2, 3, 1, 2, 1, 1]
# GP-Test  my(v=OEIS_data("A337277"),got=[]); \
# GP-Test  my(n=0); while(#got<#v, got=concat(got,A337277_row(n)); n++); \
# GP-Test  v == got[1..#v]

# GP-DEFINE  A337277_T(n,k) = {
# GP-DEFINE    k<2^(n+1)-1 || error("n="n" k="k);
# GP-DEFINE    k++; k=min(k,2^(n+1)-k);
# GP-DEFINE    my(p=0,q=1);
# GP-DEFINE    forstep(i=logint(k,2),0,-1, if(bittest(k,i),p+=q,q+=p));
# GP-DEFINE    p;
# GP-DEFINE  }
# my(n=3); vector(2^(n+1)-1,k,k--; A337277_T(n,k))
# my(n=3); A337277_row(n)
# GP-Test  vector(8,n, vector(2^(n+1)-1,k,k--; A337277_T(n,k))) == \
# GP-Test  vector(8,n, A337277_row(n))

# GP-DEFINE  \\ code by MFH in A002487
# GP-DEFINE  A002487(n, a=1, b=0) = {
# GP-DEFINE    if(n==0,return(0));
# GP-DEFINE    for(i=0, logint(n, 2), if(bittest(n, i), b+=a, a+=b)); b;
# GP-DEFINE  }
# GP-Test  my(v=OEIS_data("A002487"));  /* OFFSET=0 */ \
# GP-Test    vector(#v,n,n--; A002487(n)) == v
#
# GP-Test  /* formula by Alois P. Heinz in A337277 */ \
# GP-Test  vector(100,n,n--; A337277_T(n,n)) == \
# GP-Test  vector(100,n,n--; A002487(n+1))
# GP-Test  A002487(0) == 0

# GP-Test  /* each row the diatomic sequence forward and backward */ \
# GP-Test  vector(8,n, A337277_row(n)) == \
# GP-Test  vector(8,n, vector(2^(n+1)-1,k,k--; \
# GP-Test    if(k<2^n, A002487(k+1), A002487(2^(n+1)-1-k))))


#------------------------------------------------------------------------------
# A071911 - where diatomic == 0 mod 3

MyOEIS::compare_values
  (anum => 'A071911',
   func => sub {
     my ($count) = @_;
     my $seq = Math::NumSeq::SternDiatomic->new;
     my @got;
     while (@got < $count) {
       my ($i, $value) = $seq->next;
       if ($value%3 == 0) { push @got, $i; }
     }
     return \@got;
   });


#------------------------------------------------------------------------------
# A049455 - repeat runs diatomic 0 to 2^k

MyOEIS::compare_values
  (anum => 'A049455',
   func => sub {
     my ($count) = @_;
     my $seq = Math::NumSeq::SternDiatomic->new;
     my @got;
   OUTER: for (my $exp = 0; ; $exp++) {
       foreach my $i (0 .. 2**$exp) {
         last OUTER if @got >= $count;
         push @got, $seq->ith($i);
       }
     }
     return \@got;
   });

#------------------------------------------------------------------------------
# A049456 - extra 1 at end of each row

MyOEIS::compare_values
  (anum => 'A049456',
   func => sub {
     my ($count) = @_;
     my $seq = Math::NumSeq::SternDiatomic->new;
     my @got;
     $seq->next;
     for (;;) {
       my ($i,$value) = $seq->next;
       last if @got >= $count;
       push @got, $value;
       if ($i > 1 && is_pow2($i)) {



( run in 0.559 second using v1.01-cache-2.11-cpan-e1769b4cff6 )