update
This commit is contained in:
parent
1f1ad49427
commit
6f050a029e
2496 changed files with 37609 additions and 3031 deletions
51
Task/Multiplicative-order/Perl-6/multiplicative-order.pl6
Normal file
51
Task/Multiplicative-order/Perl-6/multiplicative-order.pl6
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
my @primes := 2, grep *.is-prime, (3,5,7...*);
|
||||
|
||||
sub factor($a is copy) {
|
||||
gather {
|
||||
for @primes -> $p {
|
||||
my $j = 0;
|
||||
while $a %% $p {
|
||||
$a div= $p;
|
||||
$j++;
|
||||
}
|
||||
take $p => $j if $j > 0;
|
||||
last if $a < $p * $p;
|
||||
}
|
||||
|
||||
take $a => 1 if $a > 1;
|
||||
}
|
||||
}
|
||||
|
||||
sub mo-prime($a, $p, $e) {
|
||||
my $m = $p ** $e;
|
||||
my $t = ($p - 1) * ($p ** ($e - 1)); # = Phi($p**$e) where $p prime
|
||||
my @qs = 1;
|
||||
for factor($t) -> $f {
|
||||
@qs = @qs.map(-> $q { (0..$f.value).map(-> $j { $q * $f.key ** $j }) });
|
||||
}
|
||||
@qs.sort();
|
||||
|
||||
@qs.first(-> $q { expmod( $a, $q, $m ) == 1});
|
||||
}
|
||||
|
||||
sub mo($a, $m) {
|
||||
$a gcd $m == 1 || die "$a and $m are not relatively prime";
|
||||
[lcm] 1, factor($m).map(-> $r { mo-prime($a, $r.key, $r.value) });
|
||||
}
|
||||
|
||||
sub MAIN("test") {
|
||||
use Test;
|
||||
|
||||
for (10, 21, 25, 150, 1231, 123141, 34131) -> $n {
|
||||
# say factor($n).perl;
|
||||
# say factor($n).map(-> $pair { $pair.key ** $pair.value }).perl;
|
||||
is ([*] factor($n).map(-> $pair { $pair.key ** $pair.value })), $n, "$n factors correctly";
|
||||
}
|
||||
|
||||
is mo(37, 1000), 100, 'mo(37,1000) == 100';
|
||||
my $b = 10**20-1;
|
||||
is mo(2, $b), 3748806900, 'mo(2,10**20-1) == 3748806900';
|
||||
is mo(17, $b), 1499522760, 'mo(17,10**20-1) == 1499522760';
|
||||
$b = 100001;
|
||||
is mo(54, $b), 9090, 'mo(54,100001) == 9090';
|
||||
}
|
||||
25
Task/Multiplicative-order/Racket/multiplicative-order-1.rkt
Normal file
25
Task/Multiplicative-order/Racket/multiplicative-order-1.rkt
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#lang racket
|
||||
(require math)
|
||||
|
||||
(define (order a n)
|
||||
(unless (coprime? a n) (error 'order "arguments must be coprime"))
|
||||
(for/fold ([o 1]) ([r (factorize n)])
|
||||
(lcm o (order1 a r))))
|
||||
|
||||
(define (order1 a p&e)
|
||||
(match-define (list p e) p&e)
|
||||
(define m (expt p e))
|
||||
(define t (* (- p 1) (expt p (- e 1))))
|
||||
(define qs
|
||||
(for/fold ([qs '(1)]) ([f (factorize t)])
|
||||
(match f [(list f0 f1)
|
||||
(for*/list ([q qs] [j (in-range (+ 1 f1))])
|
||||
(* q (expt f0 j)))])))
|
||||
(for/or ([q (sort qs <)] #:when (= (modular-expt a q m) 1)) q))
|
||||
|
||||
|
||||
(order 37 1000)
|
||||
(order (+ (expt 10 100) 1) 7919)
|
||||
(order (+ (expt 10 1000) 1) 15485863)
|
||||
(order (- (expt 10 10000) 1) 22801763489)
|
||||
(order 13 (+ 1 (expt 10 80)))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
100
|
||||
3959
|
||||
15485862
|
||||
22801763488
|
||||
109609547199756140150989321269669269476675495992554276140800
|
||||
Loading…
Add table
Add a link
Reference in a new issue