diff options
author | Erich Eckner <git@eckner.net> | 2015-07-10 15:10:15 +0200 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-07-10 15:20:53 +0200 |
commit | ffb35ffece4f0239cf9fcecbfba5329d7b5dc98d (patch) | |
tree | bc07a061ee40ed18106cd5a13528d074d1228960 /pseudohadamard.pas | |
parent | addd58de0c9311f791355231d53e4b280ff3537d (diff) | |
download | units-ffb35ffece4f0239cf9fcecbfba5329d7b5dc98d.tar.xz |
neue Dateien: matheunit.pas, mlockunit.pas, mystringlistunit.pas,
pseudohadamard.pas, randomunit.pas, systemunit.pas
Diffstat (limited to 'pseudohadamard.pas')
-rw-r--r-- | pseudohadamard.pas | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/pseudohadamard.pas b/pseudohadamard.pas new file mode 100644 index 0000000..654dc0e --- /dev/null +++ b/pseudohadamard.pas @@ -0,0 +1,59 @@ +unit pseudohadamard; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, Gmp, Math; + +procedure pseudoHadamardTransformation(var daten: array of mpz_t; modul: mpz_t; invers: boolean); overload; +procedure pseudoHadamardTransformation(var daten: array of mpz_t; Ordnung, Verschiebung: longint; modul: mpz_t; var buff: mpz_t; invers: boolean); overload; + +implementation + +procedure pseudoHadamardTransformation(var daten: array of mpz_t; modul: mpz_t; invers: boolean); +var + buff: mpz_t; +begin + if length(daten)<>round(power(2,round(ln(length(daten))/ln(2)))) then + raise Exception.create('Die Länge der Daten für eine Pseudohadamardtransformation muss eine Zweierpotenz sein! (und nicht '+inttostr(length(daten))+'!)'); + mpz_init(buff); + pseudoHadamardTransformation(daten,length(daten),0,modul,buff,invers); + mpz_clear(buff); +end; + +procedure pseudoHadamardTransformation(var daten: array of mpz_t; Ordnung, Verschiebung: longint; modul: mpz_t; var buff: mpz_t; invers: boolean); +var + i: longint; +begin + Ordnung:=Ordnung div 2; + if Ordnung>1 then + for i:=0 to 1 do + pseudoHadamardTransformation(daten,Ordnung,Verschiebung + i*Ordnung,modul,buff,invers); + + if invers then begin + for i:=0 to Ordnung-1 do begin + mpz_set(buff,daten[Verschiebung+i]); + mpz_sub(daten[Verschiebung+i],daten[Verschiebung+i],daten[Verschiebung+i+Ordnung]); // a = a' - b + mpz_mod(daten[Verschiebung+i],daten[Verschiebung+i],modul); + + mpz_mul_ui(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],2); // b = 2*b' + mpz_sub(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],buff); // - a' + mpz_mod(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],modul); + end; + end + else + for i:=0 to Ordnung-1 do begin + mpz_set(buff,daten[Verschiebung+i]); + mpz_mul_ui(daten[Verschiebung+i],daten[Verschiebung+i],2); // a' = 2 * a + mpz_add(daten[Verschiebung+i],daten[Verschiebung+i],daten[Verschiebung+i+Ordnung]); // + b + mpz_mod(daten[Verschiebung+i],daten[Verschiebung+i],modul); + + mpz_add(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],buff); // b' = a + b + mpz_mod(daten[Verschiebung+i+Ordnung],daten[Verschiebung+i+Ordnung],modul); + end; +end; + +end. + |