Algoritmi e Strutture Dati (Mod. B)

Slides:



Advertisements
Presentazioni simili
UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA
Advertisements

Ricorrenze Il metodo di sostituzione Il metodo iterativo
Master Bioinformatica 2002: Grafi Problema: cammini minimi da tutti i vertici a tutti i vertici Dato un grafo pesato G =(V,E,w), trovare un cammino minimo.
Programmazione dinamica: problema della sottosequenza più lunga
                      Insertion-Sort
Programmazione dinamica
Master Bioinformatica 2002: Progetto di Algoritmi1 Programmazione Dinamica (PD) Altra tecnica per risolvere problemi di ottimizzazione, piu generale degli.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 1 Unintroduzione informale agli algoritmi Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 1 Unintroduzione informale agli algoritmi Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Iterazione enumerativa (for)
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Algoritmi Paralleli e Distribuiti a.a. 2008/09
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Unintroduzione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
Algoritmi e Strutture Dati (Mod. B)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati Introduzione. Gli argomenti di oggi Analisi della bontà degli algoritmi Modello Computazionale Tempo di esecuzione degli algoritmi.
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Trovare il percorso minimo da b ad ogni altro vertice
Algoritmi e strutture dati
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Algoritmi e Strutture Dati
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
Metodo della moltiplicazione
Elementi di Informatica di base
Radix-Sort(A,d) // A[i] = cd...c2c1
Algoritmi e Strutture Dati
Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati: Programmazione dinamica Algoritmi golosi Analisi ammortizzata Vedremo poi.
Passo 3: calcolo del costo minimo
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Terzo passo: lunghezza di una LCS LCS-Length(X, Y, m, n) for i = 0 to m c[i, 0] = 0 for j = 1 to n c[0, j] = 0 for j = 1 to n for i = 1 to m if x i ==
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE La Ricorsione Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.
Capitolo 13 Cammini minimi: Algoritmo di Floyd e Warshall Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Programmazione dinamica Algoritmi golosi Analisi ammortizzata
Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.
Algoritmi golosi Tecniche di soluzione dei problemi viste finora:
Complessità Computazionale
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Un’introduzione.
Algoritmi e Strutture Dati Università di Camerino Corso di Laurea in Informatica (12 CFU) I periodo didattico Emanuela Merelli
Algoritmi e Strutture Dati Luciano Gualà
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi Simulazione di lettura e scrittura concorrente Tecnica dell’accelerated cascading Lezione.
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi Complessità e Trasportabilità Lezione n°3.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi Lezione n°9.
Prof. Cerulli – Dott. Carrabs
Transcript della presentazione:

Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Numeri di Fibonacci Algoritmo ricorsivo Definizione ricorsiva (o induttiva) F(1) = F(0) = 1 F(n) = F(n-1) + F(n-2) Algoritmo ricorsivo Fib(n: intero) if n = 0 or n = 1 then return 1 else return Fib(n-1) + Fib(n-2)

Tempo di esecuzione dell’algoritmo F(5) Tempo di esecuzione è O(2n) F(4) F(3) F(3) F(2) F(1) F(2) F(1) F(0) F(1) F(0)

La complessità in spazio è O(n). Algoritmo II Fib(n:intero) f[0] = 1 f[1] = 1 for i=2 to n f[i] = f[i-1] + f[i-2] return f[n] Un array f [] di dimensione n. La complessità in spazio è O(n). La complessità in tempo è O(n). 21 7 13 6 8 5 3 2 1 f [ ] 4 n

La complessità in spazio è O(n). Algoritmo II Fib(n:intero) f[0] = 1 f[1] = 1 for i=2 to n f[i] = f[i-1] + f[i-2] return f[n] Un array f [] di dimensione n. La complessità in spazio è O(n). La complessità in tempo è O(n). 21 7 13 6 8 5 3 2 1 f [ ] 4 n

La complessità in spazio è O(n). Algoritmo II Fib(n:intero) f[0] = 1 f[1] = 1 for i=2 to n f[i] = f[i-1] + f[i-2] return f[n] Un array f [] di dimensione n. La complessità in spazio è O(n). La complessità in tempo è O(n). 21 7 13 6 8 5 3 2 1 f [ ] 4 n

La complessità in spazio è O(1). La complessità in tempo è O(n). Algoritmo II Fib(n:intero) f[1] = f[2] = 1 for i=2 to n f[0] = f[1] f[1] = f[2] f[2] = f[0] + f[1] return f[2] Un array f [] di dimensione 2. La complessità in spazio è O(1). La complessità in tempo è O(n). 21 7 13 6 8 5 3 2 1 f [2] 4 n f [1] f [0] -

Programmazione Dinamica Strategia sviluppata intorno agli anno ‘50 nel campo dei problemi di ottimizzazione Applicazione nei casi in cui: ci sia più di una soluzione al problema alle soluzioni è associabile un indice di “bontà” (ad esempio: costo, preferenza, etc.) si vuole determinare la soluzione con indice ottimo (la soluzione ottima del problema, rispetto all’indice di “bontà”)

Programmazione Dinamica Caratterizzare la struttura di una soluzione ottima Definire ricorsivamente il valore di una soluzione otti-ma La soluzione ottima ad un problema contiene le soluzioni ottime ai sottoproblemi Calcolare il valore di una soluzione ottima “bottom-up” (cioè calcolando prima le soluzioni ai casi più semplici) Si usa una tabella per memorizzare le soluzioni dei sottoproblemi Evitare di ripetere il lavoro più volte: non ricalcolare le soluzioni di sottoproblemi già calcolate. Cotruire la (una) soluzione ottima.

Catena di moltiplcazione tra matrici Problema: Data una sequenza di matrici compat-ibili 2 a 2 al prodotto A1, A2, A3, …, An, vogliamo calcolare il loro prodotto. La moltiplicazione di matrici si basa sulla molti- plicazione scalare come operazione elementare. Vogliamo calcolare il prodotto impiegando il numero minore possibile di moltiplicazioni Il prodotto di matrici non è commutativo... ...ma è associativo [ (A1  A2)  A3 = A1  (A2  A3) ]

Moltiplicazione tra matrici 73 35 A: B: = 75 P: A: r  c B: p  q (ma deve valere che c = p ) A  B: r  q : richiede r  c  q (r  p  q) moltiplicazioni scalari

Moltiplicazione tra 2 matrici Prod-Matrici(A[r,c],B[p,q],P[r,q]: matrice) if c  p then ERRORE “dimensioni non compatibili” return else for i = 1 to r do for j = 1 to q do sum = 0 for k = 1 to c do sum = sum + A[i,k] B[k,j] P[i,j] = sum Tempo di esecuzione = (r  c  q) (n3)

Catena di moltiplcazione tra matrici 3 matrici: A B C Dimensioni: 1001 , 1100 , 1001 (( A B ) C ) Num Moltiplicazioni Memoria (A B ) 1001100 = 10000 10000 ((A B ) C ) 1001001 = 10000 100 ------------------------ ------- 20000 10100 (A ( B C )) (B C ) 11001 = 100 1 (A (B C )) 10011 = 100 100 ------------------- ------- 200 101

Catena di moltiplcazione tra matrici 4 matrici: A B C D Dimensioni: 5010, 1040, 4030, 305 ((( A B ) C ) D ) : 87500 moltiplicazioni ( A B ) 501040 = 20000 (( A B ) C ) 504030 = 60000 (( A B ) C ) D 5030 5 = 7500 ----------------------- 87500

Catena di moltiplcazione tra matrici 4 matrici: A B C D Dimensioni: 5010, 1040, 4030, 305 ((( A B ) C ) D ) : 87500 moltiplicazioni (( A ( B C )) D ) : 34500 moltiplicazioni (( A B )( C D )) : 36000 moltiplicazioni ( A (( B C ) D )) : 16000 moltiplicazioni ( A ( B ( C D ))) : 10500 moltiplicazioni

Criterio di scelta Determinare il numero di moltiplicazioni scalari necessari per i prodotti tra le matrici in ogni parentesizzazione Scegliere la parentesizzazione che richiede il numero minimo di moltiplicazioni (criterio di otti-malità) Ma quante sono le parentesizzazioni possibili? per n = 3 sono 2 per n = 4 sono 5 per n > 4 quante sono?

Definizione di parentesizzazione Definizione: Un prodotto di matrici A1A2A3…An si dice completamente parentesizzato se: consiste di una unica matrice (n = 1) oppure per qualche 1  k  n, è il prodotto, delimitato da pare-ntesi, tra i prodotti completamente parentesizzati A1A2A3…Ak e Ak+1A2A3…An A  B C A  B  C D A  B  C  D (A B) ((A B) C ) (((A B ) C ) D)

Definizione di parentesizzazione Definizione: Un prodotto di matrici A1A2A3…An si dice completamente parentesizzato se: consiste di una unica matrice (n = 1) oppure per qualche 1  k  n, è il prodotto, delimitato da pare-ntesi, tra i prodotti completamente parentesizzati A1A2A3…Ak e Ak+1A2A3…An C  D B B  C  D A A  B  C  D (C D) (B (C D)) (A (B (C D) ) )

Definizione di parentesizzazione Definizione: Un prodotto di matrici A1A2A3…An si dice completamente parentesizzato se: consiste di una unica matrice (n = 1) oppure per qualche 1  k  n, è il prodotto, delimitato da pare-ntesi, tra i prodotti completamente parentesizzati A1A2A3…Ak e Ak+1A2A3…An C  D A  B A  B  C  D (C D) (A B) ((A B ) (C D) )

Quanti modi ci sono di parentesizzare? A1, A2, A3, …, An Sia P(n) il numero di modi di calcolare il pro-dotto di n matrici. Supponiamo che l’ultima moltiplicazione sia (A1, A2, …, Ak ) (Ak+1, …, An) 1  k  n-1 per ogni scelta di parentesizzazione di (A1,A2,…,Ak ) ci sono P(n-k) possibili parentesizzazioni dell’altra porzione (Ak+1,…,An) e per ogni scelta di parentesizzazione di (Ak+1,…,An) ci sono P(k) possibili parentesizzazioni dell’altra porzione (A1,A2 ,…, Ak).

Quanti modi ci sono di parentesizzare? A1, A2, A3, …, An Sia P(n) il numero di modi di calcolare il pro-dotto di n matrici. Supponiamo che l’ultima moltiplicazione sia (A1, A2, …, Ak ) (Ak+1, …, An) 1  k  n-1 Allora ci sono P(k) P(n-k) modi per un k fissato P(n) = 1kn-1 P(k) P(n-k) P(1) = 1 4862 1430 429 132 42 14 5 2 1 P(n) 10 9 8 7 6 4 3 n

Quanti modi ci sono di parentesizzare? Allora ci sono P(k) P(n-k) modi per un k fissato Questa è una equazione di ricorrenza 4862 1430 429 132 42 14 5 2 1 P(n) 10 9 8 7 6 4 3 n

Quanti modi ci sono di parentesizzare? Allora ci sono P(k) P(n-k) modi per un k fissato Questa è una equazione di ricorrenza... … la cui soluzione è la sequenza dei numeri catalani

Quanti modi ci sono di parentesizzare? Questa è una equazione di ricorrenza... … la cui soluzione è la sequenza dei numeri catalani Quindi: enumerare tutte le possibilità, calcolare il nu-mero di moltiplicazioni e scegliere la parentesizza-zione a costo minore non è praticabile (perché il numero di possibilità è esponenziale)!

Soluzione con programmazione dinamica Caratterizzare la struttura di una soluzione ottima Definire ricorsivamente il valore di una soluzione ottima Calcolare il valore di una soluzione ottima “bottom-up” (dal basso verso l’alto) Cotruzione di una soluzione ottima. Vediamo ora una ad una le 4 fasi del processo di sviluppo

Notazione Denoteremo nel seguito con: c0 : numero di righe della matrice A1 ci-1 : numero di righe della prima matrice Ai ci : numero di colonne della matrice Ai A1…n : sia una parentesizzazione che il risultato del prodotto A1A2…An Al…r : sia una parentesizzazione che il risultato del prodotto Al…Ar

 Caratterizzare della soluzione ottima Una soluzione al problema della prentesizzazione ottima di n matrici divide il problema nei due sottoproblemi: quello del prodotto delle prime k matrici A1…k e quello delle rimanenti n-k Ak+1…n(per qualche k). La soluzione finale (A1…n) è il risultato del prodotto delle due matrici A1…k e Ak+1…n. Il costo del prodotto A1…n è la somma del costo del prodotto di A1…k più il costo di Ak+1…n, più il costo del prodotto finale tra le due matrici risultanti, cioè c0ckcn.

 Caratterizzare della soluzione ottima La soluzione finale (A1…n) è il risultato del prodotto delle due matrici A1…k e Ak+1…n. Il costo del prodotto A1…n è la somma del costo del prodotto di A1…k più il costo di Ak+1…n, più il costo del prodotto finale tra le due matrici risultanti, cioè c0ckcn. Ma come devono essere fatte le soluzioni ai due sottoproblemi A1…k e Ak+1…n per garantire che la soluzione complessiva (A1…n = A1…k  Ak+1…n) sia anch’essa ottima?

 Caratterizzare della soluzione ottima Quello che ci serve che valga è che la struttura delle soluzioni ai sottoproblemi sia analoga a quella del problema complessivo. Cioè che soluzioni ottime ai sottoproblemi permettano di costruire la soluzione ottima al problema complessivo. Teorema: Se A1…n = A1…k  Ak+1…n è una parentesizzazione ottima del prodotto A1A2…An, allora A1…k e Ak+1…n sono parentesizzazioni ottime dei prodotti A1…Ak e Ak+1…An, rispettivamente.

 Caratterizzare della soluzione ottima Teorema: Se A1…n = A1…k  Ak+1…n è una parentesizzazione ottima del prodotto A1A2…An, allora A1…k e Ak+1…n sono parentesizzazioni ottime dei prodotti A1…Ak e Ak+1…An, rispettivamente. Dimostrazione: Supponiamo che A1…n = A1…k  Ak+1…n sia una parentesizzazione ottima di A1A2…An ma che almeno uno tra A1…k e Ak+1…n non sia una parentesizzazione ottima del rispettivo prodotto. Il costo c[A1…n] = c[A1…k] + c[Ak+1…n] + c0ckcn Supponiamo che esista una parentesizzazione migliore A’1…k delle prime k matrici (cioè c[A’1…k] < c[A1…k]). Allora basterebbe sostiture A’1…k al posto A1…k per ottene-re anche una parentesizzazione migliore per A1…n .

 Caratterizzare della soluzione ottima Teorema: Se A1…n = A1…k  Ak+1…n è una parentesizzazione ottima del prodotto A1A2…An, allora A1…k e Ak+1…n sono parentesizzazioni ottime dei prodotti A1…Ak e Ak+1…An, rispettivamente. Questo teorema fornisce la caratterizzazione della struttura della soluzione ottima. Ci dice che ogni soluzione ottima al problema della parentesizzazione contiene al suo interno le soluzioni ottime dei due sottoproblemi. L’esistenza di sottostrutture ottime nella soluzione ottima di un problema è una delle caratteristiche che vanno ricercate per decidere se la tecnica di Programmazione Dinamica è applicabile.

 Definizione del valore di una soluzione ottima Il secondo passo consiste nel definire ricorsi-vamente il valore della soluzione ottima (alla parentesizzazione) in termini delle soluzioni ottime (alle parentesizzazioni) dei sottopro-blemi.

Definiamo m(1,n) ricorsivamente cone segue: Notazione Sia m(l,r) il numero ottimo di moltiplicazioni necessario calcolare il prodotto Al …r dove 1  l  r  n Definiamo m(1,n) ricorsivamente cone segue: Caso Base: m(l,r) = 0 se l = r

 Definizione del valore di una soluzione ottima Definiamo m(1,n) ricorsivamente cone segue: Caso Base: m(l,r) = 0 se l = r Caso Induttivo Supponiamo che l’ultima moltiplicazione sia Al…k  Ak+1…l dove l  k  r-1 m(l,r) = m(l,k) + m(k+1,r) + cl-1 ck cr

 Definizione del valore di una soluzione ottima Caso Base: m(l,r) = 0 se l = r Caso Induttivo Al…k  Ak+1…l dove l  k  r-1 m(l,r) = m(l,k) + m(k+1,r) + cl-1 ck cr Ma per risolvere il nostro problema ci interessa sapere per quale valore di k si ottiene il valore minimo per m(l,r)

 Definizione del valore di una soluzione ottima Caso Base: m(l,r) = 0 se l = r Caso Induttivo Al…k  Ak+1…l dove l  k  r-1 m(l,r) = m(l,k) + m(k+1,r) + cl-1 ck cr Ma non conosciamo il valore di k... … quindi dobbiamo tentarli tutti!

 Calcolo del valore di una soluzione ottima Il terzo passo consiste nel calcolare il valore della soluzione ottima (alla parentesizza-zione) in termini delle soluzioni ottime (alle parentesizzazioni) dei sottoproblemi.

 Calcolo del valore di una soluzione ottima A partire dall’equazione sotto, sarebbe facile definire un algoritmo ricorsivo che calcola il costo minimo m(1,n) di A1…n Purtroppo vedremo che tale approccio porta ad un algoritmo di costo esponenziale, non migliore dell’enumerazione esaustiva.

m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti 6 5 4 3 2 1 L R - 6 5 4 3 2 1 L R 6 5 4 3 2 1 L R m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti m(1,2) = min1  k < 2{ m(1,k) + m(k+1,2) + c1ckc2 } = m(1,1) + m(2,2) + c0c1c2

m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti 6 5 4 3 2 1 L R - 6 5 4 3 2 1 L R 6 5 4 3 2 1 L R m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti m(2,4) = min2k<4{ m(2,k) + m(k+1,4) + c1ckc4 } = min { m(2,2) + m(3,4) + c1c2c4 , m(2,3) + m(4,4) + c1c3c4 }

m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti 6 5 4 3 2 1 L R - 6 5 4 3 2 1 L R 6 5 4 3 2 1 L R m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti m(2,5) = min2k<5{ m(2,k) + m(k+1,5) + c1ckc5 } = min { m(2,2) + m(3,5) + c1c2c5 , m(2,3) + m(4,5) + c1c3c5 , m(2,4) + m(5,5) + c1c4c5 }

m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti 6 5 4 3 2 1 L R - 6 5 4 3 2 1 L R 6 5 4 3 2 1 L R m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti m(1,5) = min1k<5{ m(1,k) + m(k+1,5) + c0ckc5 } = min { m(1,1) + m(2,5) + c0c1c5 , m(1,2) + m(3,5) + c0c2c5 , m(1,3) + m(4,5) + c0c3c5 , m(1,4) + m(5,5) + c0c4c5 }

m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti 6 5 4 3 2 1 L R - 6 5 4 3 2 1 L R 6 5 4 3 2 1 L R m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti m(1,6) = min1k<6{ m(1,k) + m(k+1,6) + c0ckc6 } = min { m(1,1) + m(2,6) + c0c1c6 , m(1,2) + m(3,6) + c0c2c6 , m(1,3) + m(4,6) + c0c3c6 , m(1,4) + m(5,6) + c0c4c6 , m(1,5) + m(6,6) + c0c5c6 }