P-Adic numbers, basic: Difference between revisions

→‎{{header|Raku}}: add a gist method and output changes
m (→‎{{header|Raku}}: insignificant changes)
(→‎{{header|Raku}}: add a gist method and output changes)
Line 1,602:
<lang perl6># 20210225 Raku programming solution
 
#!/usr/bin/env raku
class Padic { has @.v is default([]) is rw ;
 
class Padic { has ($.p is default(2), @.v is default([])) is rw ;
 
method r2pa (Rat $x is copy, \p, \d) { # Reference: math.stackexchange.com/a/1187037
self.p = p;
while +self.v < d {
my %d = ^p Z=> (( $x «-« ^p ) »/» p )».&{ .denominator % p }; # .kv
for %d.keys { self.v.unshift: $_ and last if %d{$_} != 0 }
$x = ($x - self.v.first) / p
}
self.v
}
 
method add (Padic \x, \p) {
my $div = 0;
return Padic.new:
reverse gather for ( self.v.reverse Z x.v.reverse )».sum {
take ( $_ + $div ) % p and $div = $_ div> p,
v => reverse gather for ( self.v.reverse Z x.v.reverse )».sum {
}
{ take ( $_ + $div ) % p and $div = $_ div p } # .polymod
}
 
method gist { # en.wikipedia.org/wiki/P-adic_number#Notation
my %H = (0..9) Z=> ('0'..'9'); # (0x2080 .. 0x2089);
'… ' ~ self.v ~ ' ' ~ [~] self.p.comb».&{ %H{$_} }
}
}
 
given my $a\DATA = Padic.new { say .r2pa:< 5/8, 7,353/30809 47 11 }> ;
 
given my $a = Padic.new { say .r2pa: DATA[0], DATA[2], DATA[3] }
 
given my $b = Padic.new { say .r2pa: 353/30809DATA[1], 7DATA[2], 11DATA[3] }
 
say $a.add: $b, 7DATA[2] ;
 
given my $c = Padic.new { say .r2pa: 47099/10977DATA[0]+DATA[1] , 7DATA[2], 11DATA[3] }
</lang>
{{out}}
<pre>[4 229 417 229 417 229 417 229 417 229 5]17 30 ₄₇
[2 34 613 642 328 643 443 334 436 25 20 51 5]₄₇
(6 633 431 224 146 226 114 617 27 17 3)37 31 ₄₇
[6 633 431 224 146 226 114 617 27 17 3]37 31 ₄₇</pre>
 
=={{header|Wren}}==
351

edits