use Math::Cephes::Matrix qw(mat); $a = mat [[1, 2], [3, 4]]; $b = [1, 1]; print "@{$a->mul($b)}"; # print "3 7" #### use Math::MatrixReal; $a = Math::MatrixReal->new_from_rows( [[1, 2], [3, 4]] ); $b = Math::MatrixReal->new_from_cols( [ [1, 1] ] ); print $a*$b; # print "[ 3.000000000000E+000 ] # [ 7.000000000000E+000 ]" #### use PDL; $a = pdl [[1, 2],[3, 4]]; $b = pdl [[1], [1]]; print $a x $b; # print "[ # [3] # [7] # ]" #### >> a = [1, 2; 3, 4]; >> b = [1; 1]; >> a*b ans = 3 7 #### > a = matrix(c(1,2,3,4), ncol=2, byrow=T) > b = matrix(c(1,1), ncol=1) > a%*%b [,1] [1,] 3 [2,] 7 #### use Math::Cephes::Matrix qw(mat); $mat = mat [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; $mat = $mat->coef; for my $i (1..2) { # 0 first index print "@{$mat->[$i]}[1..2]\n"; } # print "5 6 # 8 9" #### use Math::MatrixReal; $mat = Math::MatrixReal->new_from_rows( [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ); for my $i (2..3) { # 1 first index for my $j (2..3) { print $mat->element($i, $j), " "; } print "\n"; } # print "5 6 # 8 9" #### use PDL; $mat = pdl [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; print $mat->slice("1:2,1:2"); # 0 first index # print "[ # [5 6] # [8 9] # ]" #### mat = [1,2,3; 4,5,6; 7,8,9]; mat(2:3, 2:3) ans = 5 6 8 9 #### > mat = matrix(1:9, ncol=3, byrow=T) > mat[2:3, 2:3] [,1] [,2] [1,] 5 6 [2,] 8 9 #### > vec = 1:10 > vec [1] 1 2 3 4 5 6 7 8 9 10 > vec %% 2 [1] 1 0 1 0 1 0 1 0 1 0 > vec[vec %% 2 == 1] [1] 1 3 5 7 9 > vec[vec %% 2 == 1] + 1 [1] 2 4 6 8 10 #### #! /usr/local/bin/perl -w use strict; # ----------------------------------------------------------- # RSA algorithm -- assymetrical\public-key cryptography # ----------------------------------------------------------- use Math::Pari qw(gcd PARI) ; # ----------------------------------------------------------- # m -- message my $m = 'Perl' ; print "original: $m\n" ; my $tmpl = 'C*' ; my @m = unpack($tmpl, $m) ; # string -> unsigned char values print "coded: @m\n" ; # n = pq -- in RSA, p & q = prime, each 1024 bits/308 digits long my $p = PARI("prime(".int(rand 50).")") ; my $q = PARI("prime(".int(rand 50).")") ; my $n = $p*$q ; # $n = Pari's obj # choose a random number r, s.t. # 1 < r < (p-1)(q-1) = b # gcd(r, b) = 1 -- relative prime my $b = ($p-1)*($q-1) ; my $r ; do {$r = int rand $b ; } until (gcd($r,$b) == 1) ; $r = PARI $r ; # rk = 1 mod (p-1)(q-1) -- k = private key; (n, r) public my $k = (1/$r)%$b ; # Pari's math operators, since vars = Pari # encrypt -- c = (m ^ r) mod n my @c ; map { $c[$_] = ($m[$_]**$r)%$n } 0..$#m ; # Perl: ** for power print "ciphered: @c\n" ; # decrypt -- m = (c ^ k) mod n my @d ; map { $d[$_] = PARI("($c[$_]^$k)%$n") } 0..$#c ; # Pari: ^ for power print "deciphered: @d\n" ; print "decoded: " . pack($tmpl, @d) . "\n" ; __END__ original: Perl coded: 80 101 114 108 ciphered: 18431 6512 5843 7236 deciphered: 80 101 114 108 decoded: Perl #### #! /usr/local/bin/perl -w use strict ; R("getwd()"); sub R { my $Rpath = "C:\\R\\rw\\bin\\" ; my $Rcmd = $Rpath . "rterm --vanilla --quiet --slave" ; my $Rscript = shift ; $Rscript =~ s/(\r|;\r)/ ;/gm ; $Rscript =~ s/<-/=/gm ; # \r or <- will break "echo" return `echo $Rscript | $Rcmd` ; } #### my $dir = 'D:\\tmp\\prog\\math\\lp32'; my $lp_solve = "d:\\mydir\\lp_solve.exe"; my $lpfile = "d:\\mydir\\model.lp"; (my $lp = << " EOF") =~ s/^\s+//gm; min: 8 x1 + 15 x2 ; c1: 10 x1 + 21 x2 > 156 ; c2: 2 x1 + x2 > 22 ; EOF open OUTFILE, "+>$lpfile"; print OUTFILE $lp; close OUTFILE; $output = qx($lp_solve < $lpfile); $output =~ s/\r//gm; print $lp; print $output; system("del $lpfile"); #### use strict; use warnings; my ($a1,$a2,$a3,$ref); for my $x (0..20) { for my $y (0..20) { $ref->[$x][$y] = rand 100; } } use Math::Cephes::Matrix qw(mat); $a1 = mat $ref; use Math::MatrixReal; $a2 = Math::MatrixReal->new_from_rows( $ref ); use PDL; use PDL::Slatec; $a3 = pdl $ref; use Benchmark qw(cmpthese); cmpthese(100, { cephes=>sub{$a1->inv()}, matrixreal=>sub{$a2->inverse()}, pdl=>sub{matinv($a3)} } ); __END__ Rate matrixreal cephes pdl matrixreal 5.28/s -- -94% -99% cephes 83.3/s 1479% -- -87% pdl 625/s 11744% 650% --