P-Adic numbers, basic: Difference between revisions

Content added Content deleted
m (→‎{{header|Raku}}: insignificant changes)
(→‎{{header|Raku}}: add a gist method and output changes)
Line 1,602: Line 1,602:
<lang perl6># 20210225 Raku programming solution
<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
method r2pa (Rat $x is copy, \p, \d) { # Reference: math.stackexchange.com/a/1187037
self.p = p;
while +self.v < d {
while +self.v < d {
my %d = ^p Z=> (( $x «-« ^p ) »/» p )».&{ .denominator % p };
my %d = ^p Z=> (( $x «-« ^p ) »/» p )».&{ .denominator % p }; # .kv
for %d.keys { self.v.unshift: $_ and last if %d{$_} != 0 }
for %d.keys { self.v.unshift: $_ and last if %d{$_} != 0 }
$x = ($x - self.v.first) / p
$x = ($x - self.v.first) / p
}
}
self.v
self
}
}


method add (Padic \x, \p) {
method add (Padic \x, \p) {
my $div = 0;
my $div = 0;
return Padic.new:
reverse gather for ( self.v.reverse Z x.v.reverse )».sum {
take ( $_ + $div ) % p and $div = $_ div p
p => 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 = Padic.new { say .r2pa: 5/8, 7, 11 }
my \DATA = < 5/8 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/30809, 7, 11 }
given my $b = Padic.new { say .r2pa: DATA[1], DATA[2], DATA[3] }


say $a.add: $b, 7;
say $a.add: $b, DATA[2] ;


given my $c = Padic.new { say .r2pa: 47099/10977, 7, 11 }
given my $c = Padic.new { say .r2pa: DATA[0]+DATA[1] , DATA[2], DATA[3] }
</lang>
</lang>
{{out}}
{{out}}
<pre>[4 2 4 2 4 2 4 2 4 2 5]
<pre> 29 17 29 17 29 17 29 17 29 17 30 ₄₇
[2 3 6 6 3 6 4 3 4 5 5]
4 13 42 28 43 43 34 36 25 20 1 ₄₇
(6 6 4 2 1 2 1 6 2 1 3)
33 31 24 46 26 14 17 7 7 37 31 ₄₇
[6 6 4 2 1 2 1 6 2 1 3]</pre>
33 31 24 46 26 14 17 7 7 37 31 ₄₇</pre>


=={{header|Wren}}==
=={{header|Wren}}==