use strict;
use warnings;
use Math::BigInt;

# Erzeugen zweier BigInt-Objekte:
my $n1 = Math::BigInt->new('123456789012345678901234567890');
my $n2 = Math::BigInt->new('987654321098765432109876543210');

# Die normalen arithmetischen Operatoren wurden ueberladen
# und unterstuetzen nun auch BigInt-Objekte:
my $nsum  = $n1 + $n2;                     # Summe
my $ndiff = $n1 - $n2;                     # Differenz
my $nprod = $n1 * $n2;                     # Produkt
my ($nquot, $nrest) = ($n2/$n1, $n2%$n1);  # Division und Rest

# Die Darstellung eines BigInt-Objekts erfolgt immer im
# kanonischen Format:
print '$n1       --> ', $n1, "\n";
print '$n2       --> ', $n2, "\n\n";
print '$n1 + $n2 --> ', $nsum , "\n";
print '$n1 - $n2 --> ', $ndiff, "\n";
print '$n1 * $n2 --> ', $nprod, "\n";
print '$n2 / $n1 --> ', $nquot, "\n";
print '$n2 % $n1 --> ', $nrest, "\n";

# Es gibt auch einen Wert fuer Nicht-Zahlen: NaN (Not-a-Number)
print '$n1 / 0   --> ', $n1 / Math::BigInt->new('0'), "\n";

# Es koennen BigInt-Zahlen und normale Zahlen vermischt werden,
# wobei immer eine BigInt-Zahl herauskommt:
print '$n1 + 999 --> ', $n1 + 999, "\n";
print '111 * 222 --> ', 111 * Math::BigInt->new('222'), "\n\n";

# Inkrement- und Dekrement-Operatoren funktionieren ebenso:
$n1 = Math::BigInt->new('9999999999');
print '$n1       --> ', $n1, "\n";
print '++$n1     --> ', ++$n1, "\n";
print '--$n1     --> ', --$n1, "\n\n";

# eine Fakultaetsberechnung wird schnell gross:
$n2 = Math::BigInt->new('50');
print $n2, '!       --> ', factorial($n2), "\n";

sub factorial 
  {
  my $n = shift;
  my $s = 1;
  $s *= $n-- while $n > 0;
  return $s;
  }

