P-Adic numbers, basic: Difference between revisions

Content added Content deleted
m (→‎{{header|Raku}}: insignificant changes)
Line 1,602: Line 1,602:
<lang perl6># 20210225 Raku programming solution
<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 {
while +self.v < d {
my %d = @k Z=> (( t «-« @k ) »/» p)».&{ .Rat.denominator % p };
my %d = ^p Z=> (( $x «-« ^p ) »/» p )».&{ .denominator % p };
for %d.keys { self.v.unshift: $_ and last if %d{$_} != 0 }
for %d.keys { self.v.unshift: $_ and last if %d{$_} != 0 }
t = (t - self.v.first) / p ;
$x = ($x - self.v.first) / p
}
}
self.v
}
}


method add(Padic \x, \p) {
method add (Padic \x, \p) {
my $div = 0;
my $div = 0;
reverse gather for self.v.reverse Z x.v.reverse {
reverse gather for ( self.v.reverse Z x.v.reverse )».sum {
take (.[0] + .[1] + $div ) % p;
take ( $_ + $div ) % p and $div = $_ div p
$div = ( .[0] + .[1] ) div p
}
}
}
}
}
}


my $a = Padic.new ;
given my $a = Padic.new { say .r2pa: 5/8, 7, 11 }
$a.r2pa: 5/8, 7, 11;
say $a.v;


my $b = Padic.new ;
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;
say $a.add: $b, 7;


my $c = Padic.new ;
given my $c = Padic.new { say .r2pa: 47099/10977, 7, 11 }
</lang>
$c.r2pa: 47099/10977, 7, 11;
say $c.v;</lang>
{{out}}
{{out}}
<pre>[4 2 4 2 4 2 4 2 4 2 5]
<pre>[4 2 4 2 4 2 4 2 4 2 5]