Hier de complete code, nu met combinatieVector() erbij.
De voorbeelden zijn hetzelfde als de vorige keer, maar nu in omgekeerde richting.
Daarna levert de code de tabel uit je eerste post.
NOOT: ik ben geen PHP programmeur, mogelijk kan je e.e.a. nog wat netter opschrijven.
Het werkt in ieder geval binnen de 3 secondenlimiet van
https://sandbox.onlinephpfunctions.com/.
PHP code:
Code: Selecteer alles
<?php
function binomial($n, $k)
{
if($k<0 || $k>$n)
{
return(0);
}
$r=$n-$k;
if($r<$k)
{
$k=$r;
}
$teller=1;
$noemer=1;
for ( $i=1; $i<=$k; $i++)
{
$teller *= ($n-$i+1);
$noemer *= $i;
}
return($teller/$noemer);
}
// geef het combinatienummer van de vector v met elementen gekozen uit in totaal n items (1,2,3,...,n)
function combinatieNummer($n, $v)
{
echo "n = ".$n."\n";
$k = sizeof($v);
echo "k = ".$k."\n";
$l=$k;
$result=1;
$delta=0;
foreach( $v as $key => $value )
{
$result+=(binomial($n,$k)-binomial($n-$value+$delta+1,$k));
$n-=($value-$delta);
$k--;
$delta=$value;
}
return($result);
}
// geef de vector van combinatienummer t van C(n,k)
function combinatieVector($n, $k, $t)
{
$v=array();
$s=0;
$vi=1;
for($i=1; $i<=$k; $i++)
{
while($s<$t)
{
$b=binomial($n-$vi,$k-$i);
$s+=$b;
$vi++;
}
$s-=$b;
array_push($v, $vi - 1);
}
return($v);
}
function printCombinatie($v)
{
$l=sizeof($v);
$i=1;
foreach($v as $value)
{
if($i==1)
{
echo "{".$value;
}
elseif($i==$l)
{
echo ", ".$value."}\n";
}
else
{
echo ", ".$value;
}
$i++;
}
}
printCombinatie(combinatieVector(6,3,15));
printCombinatie(combinatieVector(20,5,12098));
printCombinatie(combinatieVector(100,8,44176091579));
printCombinatie(combinatieVector(1234,4,32929808822));
echo "---------------------------------------\n";
for($z=1; $z<=20; $z++)
{
$w=combinatieVector(6,3,$z);
echo "Combinatie ".$z.": ";
printCombinatie($w);
}
Output:
Code: Selecteer alles
{2, 4, 6}
{5, 9, 12, 14, 18}
{4, 8, 12, 35, 67, 88, 92, 99}
{123, 456, 789, 1001}
---------------------------------------
Combinatie 1: {1, 2, 3}
Combinatie 2: {1, 2, 4}
Combinatie 3: {1, 2, 5}
Combinatie 4: {1, 2, 6}
Combinatie 5: {1, 3, 4}
Combinatie 6: {1, 3, 5}
Combinatie 7: {1, 3, 6}
Combinatie 8: {1, 4, 5}
Combinatie 9: {1, 4, 6}
Combinatie 10: {1, 5, 6}
Combinatie 11: {2, 3, 4}
Combinatie 12: {2, 3, 5}
Combinatie 13: {2, 3, 6}
Combinatie 14: {2, 4, 5}
Combinatie 15: {2, 4, 6}
Combinatie 16: {2, 5, 6}
Combinatie 17: {3, 4, 5}
Combinatie 18: {3, 4, 6}
Combinatie 19: {3, 5, 6}
Combinatie 20: {4, 5, 6}