1*b8851fccSafresh1############################################################################### 2*b8851fccSafresh1# core math lib for BigInt, representing big numbers by normal int/float's 3*b8851fccSafresh1# for testing only, will fail any bignum test if range is exceeded 4*b8851fccSafresh1 5*b8851fccSafresh1package Math::BigInt::Scalar; 6*b8851fccSafresh1 7*b8851fccSafresh1use 5.006; 8*b8851fccSafresh1use strict; 9*b8851fccSafresh1use warnings; 10*b8851fccSafresh1 11*b8851fccSafresh1require Exporter; 12*b8851fccSafresh1 13*b8851fccSafresh1our @ISA = qw(Exporter); 14*b8851fccSafresh1 15*b8851fccSafresh1our $VERSION = '0.13'; 16*b8851fccSafresh1 17*b8851fccSafresh1############################################################################## 18*b8851fccSafresh1# global constants, flags and accessory 19*b8851fccSafresh1 20*b8851fccSafresh1# constants for easier life 21*b8851fccSafresh1my $nan = 'NaN'; 22*b8851fccSafresh1 23*b8851fccSafresh1############################################################################## 24*b8851fccSafresh1# create objects from various representations 25*b8851fccSafresh1 26*b8851fccSafresh1sub _new { 27*b8851fccSafresh1 # create scalar ref from string 28*b8851fccSafresh1 my $d = $_[1]; 29*b8851fccSafresh1 my $x = $d; # make copy 30*b8851fccSafresh1 \$x; 31*b8851fccSafresh1} 32*b8851fccSafresh1 33*b8851fccSafresh1sub _from_hex { 34*b8851fccSafresh1 # not used 35*b8851fccSafresh1} 36*b8851fccSafresh1 37*b8851fccSafresh1sub _from_oct { 38*b8851fccSafresh1 # not used 39*b8851fccSafresh1} 40*b8851fccSafresh1 41*b8851fccSafresh1sub _from_bin { 42*b8851fccSafresh1 # not used 43*b8851fccSafresh1} 44*b8851fccSafresh1 45*b8851fccSafresh1sub _zero { 46*b8851fccSafresh1 my $x = 0; \$x; 47*b8851fccSafresh1} 48*b8851fccSafresh1 49*b8851fccSafresh1sub _one { 50*b8851fccSafresh1 my $x = 1; \$x; 51*b8851fccSafresh1} 52*b8851fccSafresh1 53*b8851fccSafresh1sub _two { 54*b8851fccSafresh1 my $x = 2; \$x; 55*b8851fccSafresh1} 56*b8851fccSafresh1 57*b8851fccSafresh1sub _ten { 58*b8851fccSafresh1 my $x = 10; \$x; 59*b8851fccSafresh1} 60*b8851fccSafresh1 61*b8851fccSafresh1sub _copy { 62*b8851fccSafresh1 my $x = $_[1]; 63*b8851fccSafresh1 my $z = $$x; 64*b8851fccSafresh1 \$z; 65*b8851fccSafresh1} 66*b8851fccSafresh1 67*b8851fccSafresh1# catch and throw away 68*b8851fccSafresh1sub import { } 69*b8851fccSafresh1 70*b8851fccSafresh1############################################################################## 71*b8851fccSafresh1# convert back to string and number 72*b8851fccSafresh1 73*b8851fccSafresh1sub _str { 74*b8851fccSafresh1 # make string 75*b8851fccSafresh1 "${$_[1]}"; 76*b8851fccSafresh1} 77*b8851fccSafresh1 78*b8851fccSafresh1sub _num { 79*b8851fccSafresh1 # make a number 80*b8851fccSafresh1 0+${$_[1]}; 81*b8851fccSafresh1} 82*b8851fccSafresh1 83*b8851fccSafresh1sub _zeros { 84*b8851fccSafresh1 my $x = $_[1]; 85*b8851fccSafresh1 86*b8851fccSafresh1 $x =~ /\d(0*)$/; 87*b8851fccSafresh1 length($1 || ''); 88*b8851fccSafresh1} 89*b8851fccSafresh1 90*b8851fccSafresh1sub _rsft { 91*b8851fccSafresh1 # not used 92*b8851fccSafresh1} 93*b8851fccSafresh1 94*b8851fccSafresh1sub _lsft { 95*b8851fccSafresh1 # not used 96*b8851fccSafresh1} 97*b8851fccSafresh1 98*b8851fccSafresh1sub _mod { 99*b8851fccSafresh1 # not used 100*b8851fccSafresh1} 101*b8851fccSafresh1 102*b8851fccSafresh1sub _gcd { 103*b8851fccSafresh1 # not used 104*b8851fccSafresh1} 105*b8851fccSafresh1 106*b8851fccSafresh1sub _sqrt { 107*b8851fccSafresh1 # not used 108*b8851fccSafresh1} 109*b8851fccSafresh1 110*b8851fccSafresh1sub _root { 111*b8851fccSafresh1 # not used 112*b8851fccSafresh1} 113*b8851fccSafresh1 114*b8851fccSafresh1sub _fac { 115*b8851fccSafresh1 # not used 116*b8851fccSafresh1} 117*b8851fccSafresh1 118*b8851fccSafresh1sub _modinv { 119*b8851fccSafresh1 # not used 120*b8851fccSafresh1} 121*b8851fccSafresh1 122*b8851fccSafresh1sub _modpow { 123*b8851fccSafresh1 # not used 124*b8851fccSafresh1} 125*b8851fccSafresh1 126*b8851fccSafresh1sub _log_int { 127*b8851fccSafresh1 # not used 128*b8851fccSafresh1} 129*b8851fccSafresh1 130*b8851fccSafresh1sub _as_hex { 131*b8851fccSafresh1 sprintf("0x%x", ${$_[1]}); 132*b8851fccSafresh1} 133*b8851fccSafresh1 134*b8851fccSafresh1sub _as_bin { 135*b8851fccSafresh1 sprintf("0b%b", ${$_[1]}); 136*b8851fccSafresh1} 137*b8851fccSafresh1 138*b8851fccSafresh1sub _as_oct { 139*b8851fccSafresh1 sprintf("0%o", ${$_[1]}); 140*b8851fccSafresh1} 141*b8851fccSafresh1 142*b8851fccSafresh1############################################################################## 143*b8851fccSafresh1# actual math code 144*b8851fccSafresh1 145*b8851fccSafresh1sub _add { 146*b8851fccSafresh1 my ($c, $x, $y) = @_; 147*b8851fccSafresh1 $$x += $$y; 148*b8851fccSafresh1 return $x; 149*b8851fccSafresh1} 150*b8851fccSafresh1 151*b8851fccSafresh1sub _sub { 152*b8851fccSafresh1 my ($c, $x, $y) = @_; 153*b8851fccSafresh1 $$x -= $$y; 154*b8851fccSafresh1 return $x; 155*b8851fccSafresh1} 156*b8851fccSafresh1 157*b8851fccSafresh1sub _mul { 158*b8851fccSafresh1 my ($c, $x, $y) = @_; 159*b8851fccSafresh1 $$x *= $$y; 160*b8851fccSafresh1 return $x; 161*b8851fccSafresh1} 162*b8851fccSafresh1 163*b8851fccSafresh1sub _div { 164*b8851fccSafresh1 my ($c, $x, $y) = @_; 165*b8851fccSafresh1 166*b8851fccSafresh1 my $u = int($$x / $$y); my $r = $$x % $$y; $$x = $u; 167*b8851fccSafresh1 return ($x, \$r) if wantarray; 168*b8851fccSafresh1 return $x; 169*b8851fccSafresh1} 170*b8851fccSafresh1 171*b8851fccSafresh1sub _pow { 172*b8851fccSafresh1 my ($c, $x, $y) = @_; 173*b8851fccSafresh1 my $u = $$x ** $$y; $$x = $u; 174*b8851fccSafresh1 return $x; 175*b8851fccSafresh1} 176*b8851fccSafresh1 177*b8851fccSafresh1sub _and { 178*b8851fccSafresh1 my ($c, $x, $y) = @_; 179*b8851fccSafresh1 my $u = int($$x) & int($$y); $$x = $u; 180*b8851fccSafresh1 return $x; 181*b8851fccSafresh1} 182*b8851fccSafresh1 183*b8851fccSafresh1sub _xor { 184*b8851fccSafresh1 my ($c, $x, $y) = @_; 185*b8851fccSafresh1 my $u = int($$x) ^ int($$y); $$x = $u; 186*b8851fccSafresh1 return $x; 187*b8851fccSafresh1} 188*b8851fccSafresh1 189*b8851fccSafresh1sub _or { 190*b8851fccSafresh1 my ($c, $x, $y) = @_; 191*b8851fccSafresh1 my $u = int($$x) | int($$y); $$x = $u; 192*b8851fccSafresh1 return $x; 193*b8851fccSafresh1} 194*b8851fccSafresh1 195*b8851fccSafresh1sub _inc { 196*b8851fccSafresh1 my ($c, $x) = @_; 197*b8851fccSafresh1 my $u = int($$x)+1; $$x = $u; 198*b8851fccSafresh1 return $x; 199*b8851fccSafresh1} 200*b8851fccSafresh1 201*b8851fccSafresh1sub _dec { 202*b8851fccSafresh1 my ($c, $x) = @_; 203*b8851fccSafresh1 my $u = int($$x)-1; $$x = $u; 204*b8851fccSafresh1 return $x; 205*b8851fccSafresh1} 206*b8851fccSafresh1 207*b8851fccSafresh1############################################################################## 208*b8851fccSafresh1# testing 209*b8851fccSafresh1 210*b8851fccSafresh1sub _acmp { 211*b8851fccSafresh1 my ($c, $x, $y) = @_; 212*b8851fccSafresh1 return ($$x <=> $$y); 213*b8851fccSafresh1} 214*b8851fccSafresh1 215*b8851fccSafresh1sub _len { 216*b8851fccSafresh1 return length("${$_[1]}"); 217*b8851fccSafresh1} 218*b8851fccSafresh1 219*b8851fccSafresh1sub _digit { 220*b8851fccSafresh1 # return the nth digit, negative values count backward 221*b8851fccSafresh1 # 0 is the rightmost digit 222*b8851fccSafresh1 my ($c, $x, $n) = @_; 223*b8851fccSafresh1 224*b8851fccSafresh1 $n ++; # 0 => 1, 1 => 2 225*b8851fccSafresh1 return substr($$x, -$n, 1); # 1 => -1, -2 => 2 etc 226*b8851fccSafresh1} 227*b8851fccSafresh1 228*b8851fccSafresh1############################################################################## 229*b8851fccSafresh1# _is_* routines 230*b8851fccSafresh1 231*b8851fccSafresh1sub _is_zero { 232*b8851fccSafresh1 # return true if arg is zero 233*b8851fccSafresh1 my ($c, $x) = @_; 234*b8851fccSafresh1 ($$x == 0) <=> 0; 235*b8851fccSafresh1} 236*b8851fccSafresh1 237*b8851fccSafresh1sub _is_even { 238*b8851fccSafresh1 # return true if arg is even 239*b8851fccSafresh1 my ($c, $x) = @_; 240*b8851fccSafresh1 (!($$x & 1)) <=> 0; 241*b8851fccSafresh1} 242*b8851fccSafresh1 243*b8851fccSafresh1sub _is_odd { 244*b8851fccSafresh1 # return true if arg is odd 245*b8851fccSafresh1 my ($c, $x) = @_; 246*b8851fccSafresh1 ($$x & 1) <=> 0; 247*b8851fccSafresh1} 248*b8851fccSafresh1 249*b8851fccSafresh1sub _is_one { 250*b8851fccSafresh1 # return true if arg is one 251*b8851fccSafresh1 my ($c, $x) = @_; 252*b8851fccSafresh1 ($$x == 1) <=> 0; 253*b8851fccSafresh1} 254*b8851fccSafresh1 255*b8851fccSafresh1sub _is_two { 256*b8851fccSafresh1 # return true if arg is one 257*b8851fccSafresh1 my ($c, $x) = @_; 258*b8851fccSafresh1 ($$x == 2) <=> 0; 259*b8851fccSafresh1} 260*b8851fccSafresh1 261*b8851fccSafresh1sub _is_ten { 262*b8851fccSafresh1 # return true if arg is one 263*b8851fccSafresh1 my ($c, $x) = @_; 264*b8851fccSafresh1 ($$x == 10) <=> 0; 265*b8851fccSafresh1} 266*b8851fccSafresh1 267*b8851fccSafresh1############################################################################### 268*b8851fccSafresh1# check routine to test internal state of corruptions 269*b8851fccSafresh1 270*b8851fccSafresh1sub _check { 271*b8851fccSafresh1 # no checks yet, pull it out from the test suite 272*b8851fccSafresh1 my ($c, $x) = @_; 273*b8851fccSafresh1 return "$x is not a reference" if !ref($x); 274*b8851fccSafresh1 return 0; 275*b8851fccSafresh1} 276*b8851fccSafresh1 277*b8851fccSafresh11; 278*b8851fccSafresh1 279*b8851fccSafresh1__END__ 280*b8851fccSafresh1 281*b8851fccSafresh1=head1 NAME 282*b8851fccSafresh1 283*b8851fccSafresh1Math::BigInt::Scalar - Pure Perl module to test Math::BigInt with scalars 284*b8851fccSafresh1 285*b8851fccSafresh1=head1 SYNOPSIS 286*b8851fccSafresh1 287*b8851fccSafresh1Provides support for big integer calculations via means of 'small' int/floats. 288*b8851fccSafresh1Only for testing purposes, since it will fail at large values. But it is simple 289*b8851fccSafresh1enough not to introduce bugs on it's own and to serve as a testbed. 290*b8851fccSafresh1 291*b8851fccSafresh1=head1 DESCRIPTION 292*b8851fccSafresh1 293*b8851fccSafresh1Please see Math::BigInt::Calc. 294*b8851fccSafresh1 295*b8851fccSafresh1=head1 LICENSE 296*b8851fccSafresh1 297*b8851fccSafresh1This program is free software; you may redistribute it and/or modify it under 298*b8851fccSafresh1the same terms as Perl itself. 299*b8851fccSafresh1 300*b8851fccSafresh1=head1 AUTHOR 301*b8851fccSafresh1 302*b8851fccSafresh1Tels http://bloodgate.com in 2001 - 2007. 303*b8851fccSafresh1 304*b8851fccSafresh1=head1 SEE ALSO 305*b8851fccSafresh1 306*b8851fccSafresh1L<Math::BigInt>, L<Math::BigInt::Calc>. 307*b8851fccSafresh1 308*b8851fccSafresh1=cut 309