ANALYSIS of ALGORITHMS, Bulletin Board

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Median-of-three quickselect: inversions and distance. (III)






Greetings.

I am sending the initial conditions for the distance from the identity
permutation after a single median-of-three quickselect as asked for by
H. Prodinger.

z^1 u^1: 1: 0/1
z^2 u^1: 2: 0/2
z^2 u^2: 2: 0/2
z^3 u^1: 6: 0/6
z^3 u^2: 6: 0/6
z^3 u^3: 6: 0/6
z^4 u^1: 18 + 6v^2: 12/24
z^4 u^2: 18 + 6v^2: 12/24
z^4 u^3: 18 + 6v^2: 12/24
z^4 u^4: 18 + 6v^2: 12/24
z^5 u^1: 66 + 36v^2 + 12v^6 + 6v^8: 192/120
z^5 u^2: 66 + 36v^2 + 12v^6 + 6v^8: 192/120
z^5 u^3: 84 + 24v^2 + 12v^4: 96/120
z^5 u^4: 66 + 36v^2 + 12v^6 + 6v^8: 192/120
z^5 u^5: 66 + 36v^2 + 12v^6 + 6v^8: 192/120
z^6 u^1: 258 + 234v^2 + 6v^4 + 96v^6 + 48v^8 + 12v^10 + 12v^12 + 24v^14 + 6v^16 + 18v^18 + 6v^20: 2592/720
z^6 u^2: 258 + 234v^2 + 6v^4 + 96v^6 + 48v^8 + 12v^10 + 12v^12 + 24v^14 + 6v^16 + 18v^18 + 6v^20: 2592/720
z^6 u^3: 342 + 234v^2 + 36v^4 + 36v^6 + 54v^8 + 18v^10: 1440/720
z^6 u^4: 342 + 234v^2 + 36v^4 + 36v^6 + 54v^8 + 18v^10: 1440/720
z^6 u^5: 258 + 234v^2 + 6v^4 + 96v^6 + 48v^8 + 12v^10 + 12v^12 + 24v^14 + 6v^16 + 18v^18 + 6v^20: 2592/720
z^6 u^6: 258 + 234v^2 + 6v^4 + 96v^6 + 48v^8 + 12v^10 + 12v^12 + 24v^14 + 6v^16 + 18v^18 + 6v^20: 2592/720
z^7 u^1: 1098 + 1392v^2 + 210v^4 + 732v^6 + 390v^8 + 132v^10 + 120v^12 + 252v^14 + 84v^16 + 204v^18 + 84v^20 + 60v^22 + 36v^24 + 60v^26 + 24v^28 + 36v^30 + 42v^32 + 36v^34 + 18v^36 + 24v^38 + 6v^40: 33984/5040
z^7 u^2: 1098 + 1392v^2 + 210v^4 + 732v^6 + 390v^8 + 132v^10 + 120v^12 + 252v^14 + 84v^16 + 204v^18 + 84v^20 + 60v^22 + 36v^24 + 60v^26 + 24v^28 + 36v^30 + 42v^32 + 36v^34 + 18v^36 + 24v^38 + 6v^40: 33984/5040
z^7 u^3: 1572 + 1464v^2 + 312v^4 + 624v^6 + 396v^8 + 96v^10 + 96v^12 + 144v^14 + 120v^16 + 96v^18 + 96v^20 + 24v^22: 21312/5040
z^7 u^4: 1692 + 1728v^2 + 432v^4 + 288v^6 + 432v^8 + 144v^10 + 144v^12 + 144v^14 + 36v^16: 16128/5040
z^7 u^5: 1572 + 1464v^2 + 312v^4 + 624v^6 + 396v^8 + 96v^10 + 96v^12 + 144v^14 + 120v^16 + 96v^18 + 96v^20 + 24v^22: 21312/5040
z^7 u^6: 1098 + 1392v^2 + 210v^4 + 732v^6 + 390v^8 + 132v^10 + 120v^12 + 252v^14 + 84v^16 + 204v^18 + 84v^20 + 60v^22 + 36v^24 + 60v^26 + 24v^28 + 36v^30 + 42v^32 + 36v^34 + 18v^36 + 24v^38 + 6v^40: 33984/5040
z^7 u^7: 1098 + 1392v^2 + 210v^4 + 732v^6 + 390v^8 + 132v^10 + 120v^12 + 252v^14 + 84v^16 + 204v^18 + 84v^20 + 60v^22 + 36v^24 + 60v^26 + 24v^28 + 36v^30 + 42v^32 + 36v^34 + 18v^36 + 24v^38 + 6v^40: 33984/5040


How to read this table: multiply the first, second and third column to 
obtain the Taylor series for F(z, u, v). Multiply the first, second
and fourth column to obtain the Taylor series for d/dv F(z, u, v)_{v = 
1}. Differentiate the latter wrt. to z to obtain the Taylor series for 
Phi(z, u) = d/dz d/dv F(z, u, v)_{v = 1}. Differentiate again for d/dz 
Phi(z, u) = Phi'(z, u).

You get

d/dv F(z, u, v)_{v = 1} =
(1/2 u + 1/2 u^2 + 1/2 u^3 + 1/2 u^4) z^4 +
(8/5 u + 8/5 u^2 + 4/5 u^3 + 8/5 u^4 + 8/5 u^5) z^5 +
(18/5 u + 18/5 u^2 + 2 u^3 + 2 u^4 + 18/5 u^5 + 18/5 u^6) z^6 + ...

Phi(z, u) = d/dz d/dv F(z, u, v)_{v = 1} =
(2 u + 2 u^2 + 2 u^3 + 2 u^4) z^3 +
(8 u + 8 u^2 + 4 u^3 + 8 u^4 + 8 u^5) z^4 +
(108/5 u + 108/5 u^2 + 12 u^3 + 12 u^4 + 108/5 u^5 + 108/5 u^6) z^5 + ...

Phi'(z, u) = d/dz Phi(z, u) =
(6 u + 6 u^2 + 6 u^3 + 6 u^4) z^2 +
(32 u + 32 u^2 + 16 u^3 + 32 u^4 + 32 u^5) z^3 +
(108 u + 108 u^2 + 60 u^3 + 60 u^4 + 108 u^5 + 108 u^6) z^4 + ...

Please check my algebra.

Best regards,

Marko Riedel

----------------------------------------------------------------------

#! /usr/bin/perl -w
#

sub fact {
  my ($n) = @_;

  return 1 if $n==0 or $n==1;

  my ($p) = (1);
  $p*=$n-- while $n>1;

  return $p;
}

sub qsel {
  my ($perm, $lower, $upper, $index) = @_;
  my ($temp);

  return if $lower==$upper;

  if($lower+1==$upper){
    $temp=$perm->[$lower];

    if($temp>$perm->[$upper]){
      $perm->[$lower]=$perm->[$upper];
      $perm->[$upper]=$temp;
    }

    return;
  }

  my ($ab, $ac, $bc) =
    ($perm->[$lower]   <=> $perm->[$lower+1],
     $perm->[$lower]   <=> $perm->[$lower+2],
     $perm->[$lower+1] <=> $perm->[$lower+2]);
  if($ab==$bc){
    $temp=$perm->[$lower];
    $perm->[$lower]=$perm->[$lower+1];
    $perm->[$lower+1]=$temp;
  }
  elsif($ac==-$bc){
    $temp=$perm->[$lower];
    $perm->[$lower]=$perm->[$lower+2];
    $perm->[$lower+2]=$temp;
  }

  my ($pivot, $i, $j) = 
    ($perm->[$lower], $lower+1, $upper);
  while($i<=$j){
    while($i<=$j && $perm->[$i]<$pivot){
      $perm->[$i-1]=$perm->[$i];
      $i++;
    }
    while($j>=$i && $perm->[$j]>$pivot){
      $j--;
    }
    
    if($i<$j){
      $temp=$perm->[$i];
      $perm->[$i]=$perm->[$j];
      $perm->[$j]=$temp;
    }
  }
  $perm->[$i-1]=$pivot;

  qsel($perm, $lower, $i-2, $index) 
    if $i-2>$lower && $index<=$i-2;
  qsel($perm, $i, $upper, $index) 
    if $i<$upper && $index>=$i;
}

sub nextperm {
  my ($n, $i, $j) = @_;
  my (@crep, $rem, @source, @perm, $item);
 
  for($j=1; $j<=$n; $j++){
    $rem=$i%$j;
    unshift @crep, $rem;
    $i=($i-$rem)/$j;
  }

  @source=(0..$n-1);
  for($j=0; $j<$n; $j++){
    $item=splice @source, $crep[$j], 1;
    push @perm, $item;
  }

  return \@perm;
}

sub dist {
  my ($perm, $p) = @_;
  my ($sum) = (0);

  for(my ($k, $d)=0; 
      $k < scalar @$perm; $k++){
    $d = $k - $perm->[$k];
    $sum += $d**$p;
  }

  return $sum;
}


sub gf2string {
  my ($poly, @str, $term) = @_;

  foreach my $i ($poly->[0] .. $poly->[1]){
    if(defined $poly->[2][$i]){
      $term=($i == 0 ? '' : ($i == 1 ? 'v' : "v^$i"));
      push @str, 
      ($poly->[2][$i] == 1 ? 
       ($i==0 ? '1' : '') : "$poly->[2][$i]") .	$term;
    } 
  }

  return join ' + ', @str;
}

sub gfat1 {
  my ($poly, $total, $total1) = (@_, 0, 0);

  foreach my $i ($poly->[0] .. $poly->[1]){
    if(defined $poly->[2][$i]){
      $total  += $poly->[2][$i];
      $total1 += $i * $poly->[2][$i];
    }
  }

  return [$total1, $total];
}


MAIN: {
  my ($max, $p, $n) = @ARGV;

  die "$0 <n> <p>\n" 
    if not defined $max or not defined $p;

  for($n=1; $n<=$max; $n++){
    my ($f, $tgf, $i, $j, $perm, $dist, $at1) =
      (fact($n));
    for($j=1; $j<=$n; $j++){
      $tgf=[undef, undef, []];
      for($i=0; $i<$f; $i++){
	$perm=nextperm($n, $i);
	qsel($perm, 0, $n-1, $j-1);
	$dist=dist($perm, $p);
	
	$tgf->[0]=$dist 
	  if not defined $tgf->[0] or $tgf->[0]>$dist;
	$tgf->[1]=$dist 
	  if not defined $tgf->[1] or $tgf->[1]<$dist;
	$tgf->[2][$dist]=0 
	  if not defined $tgf->[2][$dist];
	$tgf->[2][$dist]++;
      }

      print "z^$n u^$j: " . gf2string($tgf) . ": ";
      $at1 = gfat1($tgf);
      print "$at1->[0]/$at1->[1]\n";
    }
  }
}


Date Prev | Date Next | Date Index | Thread Index