ARIBAS

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

ARIBAS ist ein freies Computerprogramm für zahlentheoretische Berechnungen. Es wurde von Otto Forster unter der GNU General Public License entwickelt.

ARIBAS ist ein Interpreter, der eine an Pascal angelehnte Syntax verwendet. Grundlegend für ARIBAS ist eine Langzahlarithmetik, die es gestattet, exakte Berechnungen auch mit sehr großen, ganzen Zahlen durchzuführen. Darauf aufbauend bietet ARIBAS eine umfangreiche Bibliothek von Funktionen aus dem Bereich der algorithmischen Zahlentheorie an. Forsters Buch Algorithmische Zahlentheorie baut auf ARIBAS auf und führt den mathematisch interessierten Leser sozusagen nebenbei in das Programm ein.

Da ARIBAS stets mit Zahlen rechnet, handelt es sich nicht um ein Computeralgebrasystem.

Eine interaktive Beispielsitzung

[Bearbeiten | Quelltext bearbeiten]

Zunächst wird die Fakultät der Zahl 30 berechnet. Das Ergebnis wird der Variable n zugewiesen. Zur leichteren Lesbarkeit langer Zahlen verwendet ARIBAS bei der Ausgabe einen Unterstrich nach jeweils fünf Ziffern.

==> n := factorial(30).
-: 265_25285_98121_91058_63630_84800_00000

Obwohl die Zahl n nicht gerade klein ist, besitzt sie lauter kleine Primfaktoren: genau die Primzahlen kleiner 30 (mit unterschiedlichen Exponenten). Wenn man Eins hinzu addiert, so erhält man eine Zahl, die keinen Teiler kleiner oder gleich 30 besitzen kann. (Z. B. ist 13 ein Teiler von n und von n+13, aber nicht von n+1). Für gewisse Ausgangszahlen (anstelle der Zahl 30 in unserem Beispiel) entstehen auf diese Art sogar große Primzahlen, sogenannte Fakultätsprimzahlen. Dass es sich im vorliegenden Fall um keine Primzahl handelt, lässt sich mit der ARIBAS Funktion rab_primetest in einem Sekundenbruchteil nachweisen (vgl. Miller-Rabin-Test):

==> rab_primetest(n+1).
-: false

Da der Nachfolger von 30, also 31, eine Primzahl und somit der Restklassenring sogar ein Körper ist, zeigt eine nicht allzu komplizierte Überlegung, dass

gelten muss. (Beweisidee: Die Faktoren 2, 3, ..., 29 heben sich modulo 31 jeweils in geeigneten Paaren zu 1 auf!) Mit anderen Worten, 31 ist ein Teiler von n+1:

==> (n+1) mod 31.
-: 0

An diesem Beispiel wird die Bedeutung einer exakten Langzahlarithmetik deutlich: Mit einem Taschenrechner lässt sich zwar 30! ebenfalls berechnen. Aber aufgrund der auf etwa 10 Ziffern begrenzten Genauigkeit lassen sich die Zahlen 30! und 30!+1 nicht voneinander unterscheiden. Der Nachweis, dass 30!+1 durch 31 ohne Rest teilbar ist, lässt sich also mit einem Taschenrechner nicht erbringen.

Kann der Quotient (n+1)/31 noch weiter faktorisiert werden?

==> q := (n+1) div 31.
-: 8_55654_38649_09388_98826_80154_83871
==> rab_primetest(q).
-: false

Auch q ist also keine Primzahl. Durch Anwendung der Pollard-Rho-Methode findet man:

==> rho_factorize(q).
working .
factor found after 256 iterations
-: 12421

Durch Wiederholung dieses Prinzips erhält man die vermutliche Primfaktorzerlegung von n+1:

==>  31 * 12421 * 82561 * 1080941 * 7_71906_83199_27551.
-: 265_25285_98121_91058_63630_84800_00001

Die Einschränkung vermutlich will hierbei sagen, dass es nicht bewiesen ist, dass sämtliche berechneten Faktoren auch wirklich prim sind. rab_primetest(...) lieferte zwar bei jedem Faktor mehrfach "true". Daraus folgt aber nur, dass es sich mit einer gewissen (relativ hohen) Wahrscheinlichkeit um Primzahlen handelt. Daher spricht man beim Miller-Rabin-Test auch von einem probabilistischen Primzahltest. Ein Ergebnis "false" hingegen ist deterministisch: Es handelt sich dann keinesfalls um eine Primzahl.

Weitere Code-Beispiele

[Bearbeiten | Quelltext bearbeiten]

ARIBAS verfügt auch über eine erweiterte Gleitkommaarithmetik, in der rationale Zahlen bis zu 4096 Bit belegen können:

==> set_floatprec(4096).
-: 4096
==> sqrt(2).
-: 1.41421_35623_73095_04880_16887_24209_69807_85696_71875_37694_80731_76679_
73799_07324_78462_10703_88503_87534_32764_15727_35013_84623_09122_97024_92483_
60558_50737_21264_41214_97099_93583_14132_22665_92750_55927_55799_95050_11527_
82060_57147_01095_59971_60597_02745_34596_86201_47285_17418_64088_91986_09552_
32923_04843_08714_32145_08397_62603_62799_52514_07989_68725_33965_46331_80882_
96406_20615_25835_23950_54745_75028_77599_61729_83557_52203_37531_85701_13543_
74603_40849_88471_60386_89997_06990_04815_03054_40277_90316_45424_78230_68492_
93691_86215_80578_46311_15966_68713_01301_56185_68987_23723_52885_09264_86124_
94977_15421_83342_04285_68606_01468_24720_77143_58548_74155_65706_96776_53720_
22648_54470_15858_80162_07584_74922_65722_60020_85584_46652_14583_98893_94437_
09265_91800_31138_82464_68157_08263_01005_94858_70400_31864_80342_19489_72782_
90641_04507_26368_81313_73985_52561_17322_04024_50912_27700_22694_11275_73627_
28049_57381_08967_50401_83698_68368_45072_57993_64729_06076_29969_41380_47565_
48237_28997_18032_68024_74420_62926_91248_59052_18100_44598_42150_59112_02494_
41341_72853_14781_05803_60337_10773_09182_86931_47101_71111_68391_65817_26889_
41975_87165_82152_12822_95184_88472_08969_46338_62891_56288_27659_52635_14054_
22676_53239_69461_75112_91602_40871_55101_35150_45538_12875_60052_63146_80171_
27402_65396_94702_40300_51749_53188_62925_63138_51881_63478_00156_93691_76881_
85237_86840_52287_83762_93892_14300_65586_95686_85964_5952

Ferner kann ARIBAS durch benutzerdefinierte Funktionen erweitert werden, wie hier am Beispiel einer Funktion zur Zerlegung kleiner Zahlen in Primfaktoren gezeigt werden soll:

 function trialdiv(x: integer): array;
 var
   st: stack;
   q: integer;
 begin
   q := 2;
   while q := factor16(x,q) do
       stack_push(st,q);
       x := x div q;
   end;
   stack_push(st,x);
   return stack2array(st);
 end;