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.
							 | 
						||
| 
								 | 
							
								
							 |