]> AND Private Git Repository - 14Secrypt.git/blob - experiments/smm.pl
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
ajout de cr
[14Secrypt.git] / experiments / smm.pl
1 :-use_module(library(clpfd)).
2
3
4 % N is the dot product of lists V1 and V2.
5 dot(V1, V2, N) :- maplist(product,V1,V2,P), sumlist(P,N).
6 product(N1,N2,N3) :- N3 is N1*N2.
7
8 % Matrix multiplication with matrices represented
9 % as lists of lists. M3 is the product of M1 and M2
10 mmult(M1, M2, M3) :- transpose(M2,MT), maplist(mm_helper(MT), M1, M3).
11 mm_helper(M2, I1, M3) :- maplist(dot(I1), M2, M3).
12
13
14 suml([],[],[]).
15
16 suml(L1,L2,[E1 + E2|R2]):-
17     L1 = [E1|T1],
18     L2 = [E2|T2],
19     suml(T1,T2,R2).
20
21
22
23 summ([],[],[]).
24 summ(M1,M2,[Lr|R2]):-
25     M1 = [E1|T1],
26     M2 = [E2|T2],
27     suml(E1,E2,Lr),
28     summ(T1,T2,R2).
29
30
31 flatten(List, Flattened):-
32   flatten(List, [], Flattened).
33
34 flatten([], Flattened, Flattened).
35 flatten([Item|Tail], L, Flattened):-
36   flatten(Item, L1, Flattened),
37   flatten(Tail, L, L1).
38 flatten(Item, Flattened, [Item|Flattened]):-
39   \+ is_list(Item).
40
41 touspositifs(X):-
42     flatten(X,XF),
43     tp(XF).
44
45 tp([]).
46 tp(X):-
47     X = [E|L],
48     E #> 0,
49     tp(L).
50
51
52
53
54
55
56 sc3(X):-
57     mmult(X,X,X2),
58     mmult(X,X2,X3),
59     mmult(X,X3,X4),
60     mmult(X,X4,X6),
61     mmult(X,X4,X6),
62     mmult(X,X6,X7),
63     mmult(X,X7,X8),
64     summ(X,X2,S1),
65     summ(S1,X3,S2),
66     summ(S2,X4,S3),
67     summ(S3,X5,S4),
68     summ(S4,X6,S5),
69     summ(S5,X7,S6),
70     summ(S6,X8,S7),
71     touspositifs(S7).
72
73 sc2(X):-
74     mmult(X,X,X2),
75     mmult(X,X2,X3),
76     mmult(X,X3,X4),
77     summ(X,X2,S1),
78     summ(S1,X3,S2),
79     summ(S2,X4,S3),
80     touspositifs(S3).
81
82
83
84
85
86 bistoc(X):-
87     X=[[A,B,C,0],[F,E,0,G],[H,0,I,J],[0,K,L,M]],
88     A in 0..2,
89     E in 0..2,
90     I in 0..2,
91     M in 0..2,
92     B in 0..1,
93     C in 0..1,
94     F in 0..1,
95     G in 0..1,
96     H in 0..1,
97     J in 0..1,
98     K in 0..1,
99     L in 0..1,
100     A + B + C  #= 2,
101     E + F+  G #= 2,
102     H+ I+ J#= 2,
103     K+L +M #= 2,
104     A+F + H#= 2,
105     B+E +K #= 2,
106     C+I + L#= 2,
107     G+ J+M #= 2,
108     label([A,B,C,F,E,G,H,I,J,K,L,M]),
109     sc2(X).
110     
111
112 display_m([]).
113 display_m([El|R]):-
114     write(El),
115     display_m(R).
116
117
118 solution(L):-
119     get_time(T0),
120     findall(X,bistoc(X),L),
121     get_time(T1),
122     DT is T1 - T0,
123     write('but : '),writeln(DT),
124     display_m(L).
125
126
127
128