#!/usr/bin/perl

use Math::BigInt;
use Math::BigFloat;

# potega($x, $n) podnosi liczbe calkowita $x do potegi $n
# z uzyciem kontroli bledow.
#
sub potega {
	my ($x, $n) = @_;
	return if $n < 1;
	return if $n != int($n);
	return _potega($x, $n);
}


# _potega($x, $n) podnosi liczbe calkowita $x do potegi $n
# bez uzycia kontroli bledow.
#
sub _potega {
	my ($x, $n) = @_;
	return $x if $n == 1;
	if ($n % 2) {
		return $x * _potega($x, $n - 1);
	} else {
		my $tmp = _potega($x, $n / 2);
		return $tmp * $tmp;
	}
}


$a = potega(3, 5);                 # Analogicznie jak 3 ** 5, ale wolniej.

$i = Math::BigInt->new(10);
$j = potega($i, 100);              # 10 do potegi 100.

$x = Math::BigFloat->new(1.001);
$e = potega($x, 1000);             # Przyblizenie e.

$i = SSLeay::BN::dec2bn("10");
$j = $i ** 100;                    # Takze 10 do potegi 100.
$j = potega($i, 100);              # Analogicznie, ale wolniej.



