| © 2008 W.Ehrhardt |
Letzte Änderung 03. Okt. 2008 |
Hier findet man eine wachsende Liste von Utility- und Einzel-Quellcodes, die
nicht CRC/Hash oder Krypto zuzuordnen sind:
Util, PRNG,
MPArith, zlib, Delphi CRT.
Das Archiv std_inc.zip
enthält immer die neueste Version der Includedatei std.inc.
Vor dem Herunterladen von Software von diesen Seiten bitte diesen
rechtlichen Hinweis beachten.
Util
Das Archiv util_2008-06-27.zip
enthält eine Ansammlung kleiner Units, die zum Teil früher separat angeboten wurden.
Hilfedateien gibt es als Windows .hlp und als .tph für die BP7 IDE.
Letzte Änderungen:
Compvers V0.18 unterstützt FPC 2.2.2, Code für TP5-7 in Sort V1.18
- Base2N V0.38:
Allgemeine Konvertierungen zur Basis 2**N, N=1...6
- Bitarray V0.17:
Bit-Array-Context mit max. 524160 Bits (Nebenprodukt des mpint-Siebs
für 16-Bit-Primzahlen)
- BTypes V0.12:
Gemeinsame grundlegende Typdefinitionen
- Compvers V0.18:
Compiler-Version als String oder Symbol
- Dates V0.33:
Implementiert Compiler- und Betriebssystem unabhängige Routinen für
das aktuelle Datum und die aktuelle Zeit (incl. Millisekunden seit
Mitternacht) und Funktionen für Julianische Tageszahlen.
- Fio V0.15:
Datei-IO mit $I- und Err-Variable (ohne try/finally),
einfache Hüllen für System-Routinen.
- Hrtimer V0.23:
Enthält einen hochauflösenden Zeitmesser für
Pascal/Delphi-Compiler, es wird der comp Datentyp verwendet. Der Zeitmesser
benutzt den RDTSC-Befehl, deshalb stoppt die Unit auf allen Systemen, die
diesen Befehl nicht unterstützen (abschaltbar via $ifdef). HRTimer wird
von einigen Optimierungs-Testprogrammen benötigt.
- Mem_util V0.94:
Implementiert Compiler-unabhängige Routinen zum Vergleich von
Speicherblöcken und zur Darstellung von Speicherbereichen als HEX- und
Base64-Strings.
- Ministat V0.43:
Kleine Statistik-Unit mit akkuraten "laufende Statistik"-Routinen für
eine und zwei Variable.
- Sort V1.18:
Allgemeine QuickSort-, HeapSort- (Standard und Bottom-up), CombSort-Routinen,
die swap/compare-Funktionen benutzen. Zusätzliche Pointerversionen haben
einen typlosen Zeiger, der in den Routinen durchgeschleift wird und zum
Zugriff auf lokale Daten usw. des Aufrufers verwendet werden kann.
- Tsc V0.35:
Diese Unit verwendet einen maschinennäheren Zugriff auf den TSC als
hrtimer. Es wird außerdem ein systemabhängiger allgemeiner Zähler bereitgestellt
(TSC falls vorhanden; sonst GetTickCount, 18.2 Hz Systick-Zähler oder Millisekunden seit
Mitternacht).
PRNG
Letzte Änderung:
Richard P. Brents xor4096-Generator
Das Archiv prng_2007-04-25.zip
enthält sechs schnelle schnelle Pseudo-Zufallszahlen-Generatoren
mit wesentlich größeren Periodenlängen als die Pascal-Funktion
random: taus88 und taus113 (Pierre L'Ecuyer), tt800 und mt19937
(Makoto Matsumoto et al, mt19937 ist der bekannte Mersenne Twister),
kiss123 (George Marsaglia), sowie xor4096 (Richard P. Brent).
Alle benutzen Kontextrecords, so daß mehrere Generatoren unabhängig
gleichzeitig benutzt werden können, sie sind nicht kryptographisch sicher.
Zusätzlich gibt es noch drei kryptographische Generatoren:
-
Bob Jenkins Public-Domain-Generator ISAAC
(Indirection, Shift, Accumulate, Add, und Count).
Die mittlere Periodenlänge wird mit 2**8295 angegeben, die minimale Länge ist 2**40.
- salsar basiert auf der Salsa20-Stromchiffre und benötigt die
salsa20-Unit aus salsa_JJJJ-MM-TT.zip.
Die Basisroutine verwendet 128-Bit Schlüssel und 8 Runden (dieser Standardwert
kann mit der Prozedur salsar_set_rounds auf 12 oder 20 geändert werden).
- aesr benutzt CTR-Modus-Routinen aus aes_JJJJ-MM-TT.zip
mit 128-Bit Schlüsseln.
Die Units und Testprogramme können mit den üblichen Compilern übersetzt
werden: Pascal (TP5/5.5/6, BP7, VP 2.1, FPC 1.0/2.0) und Delphi (1..7/9/10).
Die meisten Testprogramme brauchen die ministat- und/oder die hrtimer-Unit.
Alle Generatoren exportieren folgende Funktionen (einige spezielle Prozeduren
sind hier nicht aufgeführt):
procedure generic_init(var ctx: generic_ctx; seed: longint);
{-Init context from seed}
procedure generic_init0(var ctx: generic_ctx);
{-Init context from randseed}
procedure generic_next(var ctx: generic_ctx);
{-Next step of PRNG}
procedure generic_read(var ctx: generic_ctx; dest: pointer; len: longint);
{-Read len bytes from the PRNG to dest}
function generic_long(var ctx: generic_ctx): longint;
{-Next random positive longint}
function generic_word(var ctx: generic_ctx): word;
{-Next random word}
function generic_double(var ctx: generic_ctx): double;
{-Next random double [0..1) with 32 bit precision}
function generic_double53(var ctx: generic_ctx): double;
{-Next random double in [0..1) with 53 bit precision}
function generic_selftest: boolean;
{-Simple self-test of PRNG}
Tabelle der Generatoreigenschaften (C/B: CPU-Zyklen pro Byte,
MB/s: Millionen Bytes pro Sekunde mit 1.8 GHz Pentium 4 / Windows 98,
P7: Borland Pascal 7 Realmode mit 386 BASM;
isaac wurde kompiliert mit {$define testing}):
| Generator | ctx Größe | Periode ca. | C/B P7 | MB/s P7 | C/B D6 | MB/s D6 |
| random | (4) | 2**32 | 79.0 | 22.7 | 7.5 | 239.0 |
| taus88 | 16 | 2**88 | 80.5 | 22.3 | 6.5 | 275.8 |
| taus113 | 20 | 2**113 | 83.0 | 21.6 | 8.3 | 217.3 |
| kiss123 | 20 | 2**123 | 96.0 | 18.7 | 11.8 | 152.6 |
| tt800 | 106 | 2**800 | 230.8 | 7.8 | 18.1 | 99.2 |
| xor4096 | 522 | 2**4096 | 82.5 | 21.7 | 5.8 | 311.8 |
| mt19937 | 2502 | 2**19937 | 220.3 | 8.1 | 8.3 | 216.2 |
| aesr | 290 | 2**128 | 236.0 | 7.6 | 28.4 | 63.2 |
| salsar | 202 | 2**70 | 109.3 | 16.4 | 14.4 | 124.8 |
| isaac | 2066 | 2**8295 | 109.5 | 16.3 | 9.1 | 197.8 |
MPArith
mpa_2008-10-03.zip: Dieses Archiv enthält
Pascal-Quellcodes für Multipräzisions-Arithmetik für ganze, rationale und reelle Zahlen.
Die Basisroutinen können mit den üblichen Pascalversionen übersetzt werden,
die const-Parameter unterstützen (BP 7.0, VP 2.1, FPC 1.0/2.0/2.2
und Delphi-Versionen 1..7/9/10).
Separate Informationen gibt es auf der (englischen) Einführungsseite;
Windows- und Borland-Pascal-Hilfedateien befinden sich im Archiv.
Letzte Änderungen:
Version 1.7.23 hat folgende neue/geänderte Funktionen; eine vollständige
Liste mit kurzer Beschreibung findet man in der
Funktionsliste:
- Neue Funktionen:
invmod32,
IsPow2_w,
mp_gcd_ml (modified Lehmer),
mp_get_allocprec,
mp_is_longint,
mp_rand_ex,
mp_read_decimal_str,
mp_read_radix_str,
mp_set_allocprec,
mp_shr1,
mp_sign,
mp_xgcd_bin
- Geänderte Funktionen:
mpf_read_radix,
mp_init_prim,
mp_invmod,
mp_invmodf,
mp_isMersennePrime,
mp_is_square2,
mp_mod,
mp_xgcd mit Lehmer,
s_mp_toradix_n
MP_16BIT - verbessert: mp_div_d, mp_div_w, s_mp_div
- Anderes:
Aktualisiert: mp_calc, t_calc, t_rcalc
Umbenannt: *_2d in *_2k
Entfernt: fast_mp_invmod, mp_cmp_z
- Fehlerkorrekturen:
Anpassungen für FPC V2.2.2 in mpf_decimal, isqrt32 und mp_read_unsigned_bin
Es gibt Testprogramme für die Verifikation der Funktionen und der
Kompilierung; Demoprogramme sind enthalten u.a. für Pi-Berechnung,
Ausdruckszerlegung und -Auswertung, sowie Faktorisierung mit Pollards
rho- und (p-1)-, Williams (p+1)- und ECM-Methoden.
Meine Pascal-Routinen basieren auf vielen öffentlich zugänglichen
Ressourcen (Quellcode-Bibliotheken, Bücher, Artikel); Links findet man im
Referenzabschnitt.
zlib
zlibw114_2008-09-07.zip ist meine Pascal-Portierung
der Version 1.1.4 von zlib, der freien, allgemeinen
Bibliothek zur verlustfreien Daten-Komprimierung. Der Quellcode basiert auf
PASZLIB 1.0
von Jacques Nomssi Nzali (entspricht zlib 1.1.2). Mein Code enthält offizielle
Patches und Änderungen bis V1.1.4 und einige Ergebnisse einer E-Mail-Korrespondenz
mit Mark Adler.
Weitere Änderungen sind in gzio/minigzip, inffixed.inc, minizip, zdeflate
(Code für $ifdef FASTEST ist jetzt benutzbar), zlibh (z_assign als Workaround
für einen lästigen D6/7/9-Bug), zutil, example (Fehler in test_sync
usw. beseitigt).
Andere Erweiterungen: 1) zlibex-Unit mit anpassbaren deflate- und inflate-Routinen (incl. Testprogramm),
die Unit wird im FZCA-Demoprogramm benutzt.
2) Pascal-Port des zpipe-Beispiels.
3) Code-Verbesserungen: BUILDFIXED und assert funktionieren jetzt, Bugfix in gzerror, usw.
Letzte Änderungen:
- gzIO: Korrektur in gzopen für Dateinamen mit mehr als 80 Zeichen
- zconf: Conditional define WIN32_USE_ODS: Unter WIN32 immer OutputDebugStr für Debugausgabe verwenden,
sogar für Konsolenprogramme
- zutil: Kein Schreiben auf Konsole für WIN32-GUI-Debugcode (jetzt OutputDebugString oder MessageBox)
Die Bibliothek kann kompiliert werden mit BP7 (DOS/Win/DPMI), Delphi 1-7/9/10, Virtual
Pascal V2.1 und Free Pascal 1.0/2.0/2.2.
Die Unit-Struktur ist leicht geändert verglichen mit PASZLIB:
zlib (Funktionen),
zlibh (Typen/Konstanten),
gzio (gz-Funktionen)
sollten die einzigen Units in uses-Anweisungen der zlib-Applikationen
sein.
Achtung: die zlib-Routinen sollten nur auf Dateien mit weniger als 2 GB angewendet
werden (32 Bitzähler; Delphi eof-Fehler und/oder 32-Bit filesize Funktion).
Delphi CRT-Unit
Während der Entwicklung des mpint-Ausdrucksparsers
wurden ein paar Abweichungen von Will de Witts bewährter Delphi-CRT-Unit
im Vergleich zu BP7 festgestellt; ich habe deshalb eine etwas kompatiblere
Unit erstellt.
dcrt_2006-11-08.zip ist eine vereinfachte
Version von Will DeWitts Code mit einigen Fehlerkorrekturen (readkey,
Zeileneingabe, erweiterte Tastencodes etc) Wills 'unit was based heavily
off of the Borland CBuilder 5 RTL'. Wegen des unklaren Lizenzstatus von
Wills Unit gilt für diese meine Unit auch nicht die zlib-Lizenz,
sondern sie wird mit folgendem Ausschlußhinweis veröffentlicht:
Die Software wird ohne jegliche Zusagen oder Garantien bezüglich
Funktionalität oder Funktionsfähigkeit abgegeben. Die Autoren
übernehmen keine Verantwortung für Schäden, die durch die Benutzung
der Software verursacht werden. Wird die Software benutzt, bitte auf die
Herkunft verweisen und die Referenzen auf die anderen Autoren und Quellen
beibehalten.
Wie auch immer: Wills bzw. Borlands Unit wurde radikal umgeschrieben und
umgestellt. Leitanforderung war weitgehende Kompatibilität zur BP7-Unit.
Die Idee der Hardware/Software-Trennung der Tonerzeugung stammt von Rudy
Velthuis' Freeware-Konsoleunit, aber die Implementation ist verschieden.
Die unterstützten Tastenkombination bei der Zeileneingabe sind von BP7
(^A, ^H, ^D, ^F, ^M, ^S, ^Z), der Paradigmenwechsel von readkey zu keypressed
als Arbeitspferd findet sich bei FP. Die Tastencodes, -Übersetzungen und
-Funktionalitäten wurden dem Phoenix-BIOS-Buch und einem mit BP7
kompilierten Testprogramm entnommen.
Hier sind Links zu den beschriebenen Programmen.
Es bleiben noch einige Kleinigkeiten zu tun für seltene spezielle
erweiterte Tastenkombinationen (nationale Spezialcodes etc); aber dies
wird bei Bedarf erledigt, wenn Fehler und Probleme beseitigt werden
müssen.