Arithmetic coding/As a generalized change of radix: Difference between revisions

Content added Content deleted
m (→‎{{header|Perl}}: minor code simplification)
m (→‎{{header|Perl}}: Optimized the decoding process)
Line 256: Line 256:
# frequencies of all previously occurring symbols
# frequencies of all previously occurring symbols
foreach my $c (@chars) {
foreach my $c (@chars) {
$L->bmuladd($base, $cf{$c}*$pf);
$L->bmuladd($base, $cf{$c} * $pf);
$pf->bmul($freq{$c});
$pf->bmul($freq{$c});
}
}
Line 301: Line 301:
# Decode the input number
# Decode the input number
my $decoded = '';
my $decoded = '';
for (my $i = $base - 1 ; $i >= 0 ; $i--) {
for (my $pow = $base**($base - 1) ; $pow > 0 ; $pow /= $base) {
my $div = $enc / $pow;

my $pow = $base**$i;
my $div = ($enc / $pow);


my $c = $dict{$div};
my $c = $dict{$div};
Line 310: Line 308:
my $cv = $cf{$c};
my $cv = $cf{$c};


my $rem = ($enc - $pow*$cv) / $fv;
$enc = ($enc - $pow * $cv) / $fv;

$enc = $rem;
$decoded .= $c;
$decoded .= $c;
}
}