# podstawa($liczba, $podstawa_wej, $podstawa_wyj) konwertuje liczbe
#      midzy dwoma systemami o roznych podstawach.
#
# Przyklady:
#        podstawa(17, 9, 2)     konwertuje 17  (podstawa 9)  do podstawy 2:  10000.
#        podstawa("fff", 16, 3) konwertuje fff (podstawa 16) do podstawy 3:  12121200.
#        podstawa("g", 17, 10)  konwertuje g   (podstawa 17) do podstawy 10: 16.
#
# Uzycie zdefiniowanej ponizej funkcji podstawa_log().
#
# W przypadku bledu zwracany undef.
#
sub podstawa {
    my ($liczba, $podstawa_wej, $podstawa_wyj) = @_;
    my ($liczba_rzecz, $wynik, $i, $cyfra);

    # Konwersja liczby (ktora moze zawierac litery) do malych liter.
    $liczba = lc($liczba);

    # Zwrocenie undef (lub pustej liczby), jesli niewlasciwa podstawa.
    return if $podstawa_wej > 36 or $podstawa_wyj > 36 or
              $podstawa_wej < 2  or $podstawa_wyj < 2;

    # Konwersja $liczba z podstawy $podstawa_wej na podstawe 10.
    for $cyfra (reverse split(//, $liczba)) {
        $cyfra = ord($cyfra) - 87 if ord($cyfra) > 96;
        return if $cyfra >= $podstawa_wej;
        $liczba_rzecz += $cyfra * ($podstawa_wej ** $i++);
    }

    # Konwersja liczby z podstawy 10 do podstawy $podstawa_wyj.
    # Definicja podstawa_log() ponizej.
    for ($i = int(podstawa_log($liczba_rzecz, $podstawa_wyj)); $i >= 0; $i--) {
        $cyfra = int($liczba_rzecz / ($podstawa_wyj ** $i));
        $liczba_rzecz -= $cyfra * ($podstawa_wyj ** $i);
        $cyfra = ord($cyfra + 49) if ord($cyfra) > 57;
        $wynik .= $cyfra;
    }

    return $wynik;
}

# podstawa_log($liczba, $podstawa) oblicza logarytm liczby o podstawie $podstawa.
#
# Przyklad: podstawa_log(243, 3) to 5, poniewaz 3 ** 5 daje w wyniku 243.
#
sub podstawa_log {
	my ($liczba, $podstawa) = @_;
	return if $liczba <= 0 or $podstawa <= 0 or $podstawa == 1;
	return log($liczba) / log($podstawa);
}


