xref: /openbsd-src/gnu/usr.bin/perl/cpan/Math-BigInt/t/Math/BigInt/Scalar.pm (revision 56d68f1e19ff848c889ecfa71d3a06340ff64892)
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