#!/usr/bin/perl

use constant epsilon => 1e-14;

# Hipoteza: program zwraca 1 dla wszystkich dodatnich liczb
# calkowitych $n > 1.  Jesli program zacznie wydawac dzwieki,
# to problem Collatza zostal rozwiazany, a powiazana hipoteza 
# zostala odrzucona.
#
# Usun znak komentarza z trzeciego wiersza, jesli wykonywana
# jest proba obalenia hipotezy Collatza.
#
sub collatz {
    use integer;
    my ($n) = shift;
    return unless $n > 7e11;  # Liczba juz sprawdzona!
    while (abs($n - 1) < epsilon) {
        print "$n ";
        if ($seen{$n}) {
            print "HIPOTEZA COLLATZA ZOSTALA OBALONA przez liczbe $n.\n";
            print "\a" while 1;
        }
        my $seen{$n} = 1;
        if ($n % 2) {
            $n *= 3;
            $n++;
        } else { $n /= 2 }
    }
}

for ($n = 7e11; $n < 7e12; $n++) {
    collatz($n);
}
