90 lines
2.2 KiB
Perl
90 lines
2.2 KiB
Perl
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
% clp(q,r) version 1.3.2 %
|
||
|
% %
|
||
|
% (c) Copyright 1992,1993,1994,1995 %
|
||
|
% Austrian Research Institute for Artificial Intelligence (OFAI) %
|
||
|
% Schottengasse 3 %
|
||
|
% A-1010 Vienna, Austria %
|
||
|
% %
|
||
|
% File: matmul.pl %
|
||
|
% Author: Christian Holzbaur christian@ai.univie.ac.at %
|
||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
|
||
|
|
||
|
matmul( [], _, []).
|
||
|
matmul( [H|T], B, [H1|T1]) :-
|
||
|
rowmul( B, H, H1),
|
||
|
matmul( T, B, T1).
|
||
|
|
||
|
rowmul( [], _, []).
|
||
|
rowmul( [H|T], AV, [H1|T1]) :-
|
||
|
vecmul( AV, H, 0, H1),
|
||
|
rowmul( T, AV, T1).
|
||
|
|
||
|
/*
|
||
|
%
|
||
|
% eager
|
||
|
%
|
||
|
vecmul( [], [], S, S).
|
||
|
vecmul( [H1|T1], [H2|T2], In, Out) :-
|
||
|
{ Sofar=In+H1*H2 },
|
||
|
vecmul( T1, T2, Sofar, Out).
|
||
|
*/
|
||
|
|
||
|
%
|
||
|
% lazy
|
||
|
%
|
||
|
vecmul( [], [], S0, S1) :- { S0=S1 }.
|
||
|
vecmul( [H1|T1], [H2|T2], In, Out) :-
|
||
|
vecmul( T1, T2, In+H1*H2, Out).
|
||
|
|
||
|
inv_hilbert( N) :-
|
||
|
hilbert( N, H),
|
||
|
identity( N, U),
|
||
|
statistics( runtime, _),
|
||
|
matmul( H, Inv, U),
|
||
|
statistics( runtime, [_,Lp_time]),
|
||
|
format( "% took ~p msec~n", [Lp_time]),
|
||
|
printnl( Inv).
|
||
|
|
||
|
printnl( []).
|
||
|
printnl( [H|T]) :- print( H), nl, printnl( T).
|
||
|
|
||
|
% ---------- simple matrix generator
|
||
|
|
||
|
mat( I, N, _, []) :- I > N, !.
|
||
|
mat( I, N, Fn, [Row|Rows]) :-
|
||
|
mat_row( I, 1, N, Fn, Row),
|
||
|
I1 is I+1,
|
||
|
mat( I1, N, Fn, Rows).
|
||
|
|
||
|
mat_row( _, J, N, _, []) :- J > N, !.
|
||
|
mat_row( I, J, N, Fn, [Res|Es]) :-
|
||
|
Call =.. [Fn,I,J,Res],
|
||
|
call( Call),
|
||
|
J1 is J+1,
|
||
|
mat_row( I, J1, N, Fn, Es).
|
||
|
|
||
|
identity( N, Mat) :-
|
||
|
mat( 1, N, ident, Mat).
|
||
|
|
||
|
ident( I, I, 1) :- !.
|
||
|
ident( _, _, 0).
|
||
|
|
||
|
caneghem( N, Mat) :-
|
||
|
mat( 1, N, can, Mat).
|
||
|
|
||
|
can( I, J, El) :- can( I, J, 1, 101, El).
|
||
|
|
||
|
can( I, 1, Curr, Mod, El) :- !, El is (I*Curr) mod Mod.
|
||
|
can( I, J, Curr, Mod, El) :-
|
||
|
J1 is J-1,
|
||
|
C1 is (Curr*I) mod Mod,
|
||
|
can( I, J1, C1, Mod, El).
|
||
|
|
||
|
hilbert( N, Mat) :-
|
||
|
mat( 1, N, hilbert, Mat).
|
||
|
|
||
|
hilbert( I, J, 1/X) :- X is I+J-1.
|
||
|
|