#!/usr/bin/perl

sub pot_wolne {
    use integer;
    my ( $wynik, $i, $j ) = (1, @_);
    $wynik *= $i while $j--;
    return $wynik;
}

sub pot_rekurencyjnie {
    use integer;
    my ( $dol, $i, $j ) = ( 1, @_ );
    return $i - $i + 1 if $j == 0;
    return $i          if $j == 1;
    if ( $j % 2 ) {                      # Czy $j jest nieparzyste?
        $dol = $i;
        --$j;
    }
    my $gorna_polowa = pot_rekurencyjnie ( $i, $j/2 );
    return $gorna_polowa * $gorna_polowa * $dol;
}

sub pot_szybkie {
    use integer;
    my ( $i, $j ) = @_;
    my $wynik    = $i-$i+1;
    my $pot2      = $i;

    while ( $j ) {
        if ( $j%2 ) {
            $wynik = $pot2 * $wynik;
            $j--;
        }
        $j /= 2;
        $pot2 = $pot2 * $pot2;
    }
    return $wynik;
}

print pot_wolne(5, 7), "\n";
print pot_rekurencyjnie(5, 7), "\n";
print pot_szybkie(5, 7), "\n";
