P-Adic numbers, basic: Difference between revisions

m
→‎{{header|Raku}}: insignificant changes
m (→‎{{header|Raku}}: insignificant changes)
Line 1,602:
<lang perl6># 20210225 Raku programming solution
 
class Padic { has @.v is default([]) is rw ;
#!/usr/bin/env raku
 
class Padic { has @.v is rw ;
 
method r2pa (Rat \x, \p, \d) { # Reference: math.stackexchange.com/a/1187037
my @k = ^p ;
my \t = $ = x ;
 
method r2pa (Rat \$x is copy, \p, \d) { # Reference: math.stackexchange.com/a/1187037
while +self.v < d {
my %d = @k^p Z=> (( t$x «-« @k^p ) »/» p )».&{ .Rat.denominator % p };
for %d.keys { self.v.unshift: $_ and last if %d{$_} != 0 }
t$x = (t$x - self.v.first) / p ;
}
self.v
}
 
method add (Padic \x, \p) {
my $div = 0;
reverse gather for ( self.v.reverse Z x.v.reverse )».sum {
take (.[0] + .[1]$_ + $div ) % p; and $div = $_ div p
$div = ( .[0] + .[1] ) div p
}
}
}
 
given my $a = Padic.new ;{ say .r2pa: 5/8, 7, 11 }
$a.r2pa: 5/8, 7, 11;
say $a.v;
 
given my $b = Padic.new ;{ say .r2pa: 353/30809, 7, 11 }
$b.r2pa: 353/30809, 7, 11;
say $b.v;
 
say $a.add: $b, 7;
 
given my $c = Padic.new ;{ say .r2pa: 47099/10977, 7, 11 }
say $c.v;</lang>
$c.r2pa: 47099/10977, 7, 11;
say $c.v;</lang>
{{out}}
<pre>[4 2 4 2 4 2 4 2 4 2 5]
351

edits