DEC
02
2020

# matrix chain multiplication parenthesization

The problem is not actually to perform the multiplications, but merely to decide in which order to perform the multiplications.We have many options to multiply a chain of matrices because matrix multiplication is associative. 79 . zakkgcm / matrixdp.py. Matrix Chain Multiplication [Parenthesization Evaluation] skb50bd. acknowledge that you have read and understood our, GATE CS Original Papers and Official Keys, ISRO CS Original Papers and Official Keys, ISRO CS Syllabus for Scientist/Engineer Exam, Divide and Conquer | Set 5 (Strassen’s Matrix Multiplication), Easy way to remember Strassen’s Matrix Equation, Strassen’s Matrix Multiplication Algorithm | Implementation, Matrix Chain Multiplication (A O(N^2) Solution), Printing brackets in Matrix Chain Multiplication Problem, Median of two sorted arrays of different sizes, Median of two sorted arrays with different sizes in O(log(min(n, m))), Median of two sorted arrays of different sizes | Set 1 (Linear), Top 20 Dynamic Programming Interview Questions, Overlapping Subproblems Property in Dynamic Programming | DP-1, Minimum and Maximum values of an expression with * and +, http://en.wikipedia.org/wiki/Matrix_chain_multiplication, http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Dynamic/chainMatrixMult.htm, Printing Matrix Chain Multiplication (A Space Optimized Solution), Divide and Conquer | Set 5 (Strassen's Matrix Multiplication), Program for scalar multiplication of a matrix, Finding the probability of a state at a given time in a Markov chain | Set 2, Find the probability of a state at a given time in a Markov chain | Set 1, Find multiplication of sums of data of leaves at same levels, Multiplication of two Matrices in Single line using Numpy in Python, Maximize sum of N X N upper left sub-matrix from given 2N X 2N matrix, Circular Matrix (Construct a matrix with numbers 1 to m*n in spiral way), Find trace of matrix formed by adding Row-major and Column-major order of same matrix, Count frequency of k in a matrix of size n where matrix(i, j) = i+j, Program to check diagonal matrix and scalar matrix, Check if it is possible to make the given matrix increasing matrix or not, Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming), Find minimum number of coins that make a given value, Efficient program to print all prime factors of a given number, Program to find largest element in an array, Find the number of islands | Set 1 (Using DFS), Write Interview Please use ide.geeksforgeeks.org, generate link and share the link here. Therefore, the problem has optimal substructure property and can be easily solved using recursion.Minimum number of multiplication needed to multiply a chain of size n = Minimum of all n-1 placements (these placements create subproblems of smaller size). Given a sequence of n matrices A 1, A 2, ... and the brute-force method of exhaustive search is a poor strategy for determining the optimal parenthesization of a matrix chain. Please write to us at contribute@geeksforgeeks.org to report any issue with the above content. Never . Clearly the first parenthesization requires less number of operations.Given an array p[] which represents the chain of matrices such that the ith matrix Ai is of dimension p[i-1] x p[i]. So, how do we optimally parenthesize a matrix chain? We need to write a function MatrixChainOrder() that should return the minimum number of multiplications needed to multiply the chain. I have the following code to determine the minimum number of multiplications required to multiply all matrices: ll Skip to content. From the book, we have the algorithm MATRIX-CHAIN-ORDER(p), which will be used to solve this problem. All gists Back to GitHub Sign in Sign up Sign in Sign up {{ message }} Instantly share code, notes, and snippets. Applications: Minimum and Maximum values of an expression with * and + References: python optimal matrix chain multiplication parenthesization using DP - matrixdp.py. Matrix Chain Multiplication Increasing Cost Function Rigid Pair Basic Initial Problem Optimal Parenthesization These keywords were added by machine and not by the authors. Find an optimal parenthesization of a matrix-chain product whose sequence of dimensions is: (5, 10, 3, 12, 5, 50, 6). python optimal matrix chain multiplication parenthesization using DP - matrixdp.py. For example, if the given chain is of 4 matrices. 1. Let A 1 be 10 by 100, A 2 be 100 by 5, and A 3 be 5 by 50. September 2, 2012 Nausheen Ahmed COMP 510 Fall 2012. Find an optimal parenthesization of a matrix-chain product whose sequence of dimensions is $\langle 5, 10, 3, 12, 5, 50, 6 \rangle$. Lecture 17: Dynamic Programming - Matrix Chain Parenthesization COMS10007 - Algorithms Dr. Christian Konrad 27.04.2020 Dr. Christian Konrad Lecture 17: Matrix Chain Parenthesization 1/ 18 Lecture 13: Chain Matrix Multiplication CLRS Section 15.2 Revised April 17, 2003 Outline of this Lecture Recalling matrix multiplication. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready. Let us proceed with working away from the diagonal. Given a sequence of matrices, find the most efficient way to multiply these matrices together. Example of Matrix Chain Multiplication. Dynamic Programming Solution Following is the implementation of the Matrix Chain Multiplication problem using Dynamic Programming (Tabulation vs Memoization), Time Complexity: O(n3 )Auxiliary Space: O(n2)Matrix Chain Multiplication (A O(N^2) Solution) Printing brackets in Matrix Chain Multiplication ProblemPlease write comments if you find anything incorrect, or you want to share more information about the topic discussed above.Applications: Minimum and Maximum values of an expression with * and +References: http://en.wikipedia.org/wiki/Matrix_chain_multiplication http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Dynamic/chainMatrixMult.htm. Don’t stop learning now. Given a sequence (chain) of matrices any two consecutive ones of which are compatible for multiplication, we may compute the product of the whole sequence of matrices by repeatedly replacing any two consecutive matrices by their product, until only one matrix remains. Section 2 describes the method that is used for matrix chain product, which includes algorithm to multiply two matrices, multiplication of two matrices, matrix chain … Matrix-Chain Multiplication Problem Javed Aslam, Cheng Li, Virgil Pavlu [this solution follows \Introduction to Algorithms" book by Cormen et al] ... into the parenthesization of its pre x chain and the parenthesization of its su x chain. We need to compute M [i,j], 0 ≤ i, j≤ 5. For example, suppose A is a 10 × 30 matrix, B is a 30 × 5 matrix, and C is a 5 × 60 matrix. We need to write a function MatrixChainOrder() that should return the minimum number of multiplications needed to multiply the chain. Outline Outline Review of matrix multiplication. The best parenthesization is nearly 10 times better than the worst one! An using the minimum number of scalar multiplications. We need to write a function MatrixChainOrder() that should return the minimum number of multiplications needed to multiply the chain. Matrix chain multiplication (or Matrix Chain Ordering Problem, MCOP) is an optimization problem that can be solved using dynamic programming.Given a sequence of matrices, the goal is to find the most efficient way to multiply these matrices.The problem is not actually to perform the multiplications, but merely to decide the sequence of the matrix multiplications involved. we need to find the optimal way to parenthesize the chain of matrices.. ⇒Find a parenthesization that minimizes the number of multiplications The remainder of this paper is organized as follows. Given some matrices, in what order you would multiply them to minimize cost of multiplication. 1 I want to test some parenthesizations for matrix chain multiplication. i.e, we want to compute the product A1A2…An. A dynamic programming algorithm for chain ma-trix multiplication. By using our site, you This process is experimental and the keywords may be updated as the learning algorithm improves. 3. The minimum number of scalar multiplication required, for parenthesization of a matrix-chain product whose sequence of dimensions for four matrices is <5, 10, 3, 12, 5> is 630 580 Sign Up, it unlocks many cool features! We can see that there are many subproblems being called more than once. Matrix Chain Multiplication with daa tutorial, introduction, Algorithm, Asymptotic Analysis, Control Structure, Recurrence, Master Method, ... Matrix Chain Multiplication Problem can be stated as "find the optimal parenthesization of a chain of matrices to be multiplied such that the number of scalar multiplication is minimized". For example, if we had four matrices A, B, C, and D, we would have: However, the order in which we parenthesize the product affects the number of simple arithmetic operations needed to compute the product, or the efficiency. could anyone can share a free webs source where could i get parenthesization for my data. Not a member of Pastebin yet? ⚫Let us use the following example: Let A be a 2x10 matrix So when we place a set of parenthesis, we divide the problem into subproblems of smaller size. ÔŠnŞ)„R9ôŠ~ıèı&8gœÔ¦“éz}¾ZªÙ59ñêËŒï¬ëÎ(4¾°¥Z|rTA]5 Assignment 1. Matrix-Chain Multiplication • Let A be an n by m matrix, let B be an m by p matrix, then C = AB is an n by p matrix. In other words, no matter how we parenthesize the product, the result will be the same. For example, suppose A is ... (10×30×60) = 9000 + 18000 = 27000 operations. For a single matrix, we have only one parenthesization. brightness_4 Attention reader! Matrix Chain Multiplication (A O(N^2) Solution) Printing brackets in Matrix Chain Multiplication Problem Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. • C = AB can be computed in O(nmp) time, using traditional matrix multiplication. Created Nov 7, 2017. close, link Output: Give a parenthesization for the product 1× 2×…× that achieves the minimum number of element by element multiplications. Note that consecutive matrices are compatible and can be multiplied. Determine where to place parentheses to minimize the number of multiplications. It thus pays to think about how to multiply matrices before you actually do it. Example: We are given the sequence {4, 10, 3, 12, 20, and 7}. Matrix multiplication is associative. Before going to main problem first remember some basis. Following is Python implementation for Matrix Chain Multiplication problem using Dynamic Programming. Like other typical Dynamic Programming(DP) problems, recomputations of same subproblems can be avoided by constructing a temporary array m[][] in bottom up manner. vÑ‹ ªêØ*,ÙU´~¤¾e‡³\--�ë¬‚ˆ¡¼‡�‡Ÿÿ.­ÉëÕzşy:[«Ãã#õ×p •.´Ö@@+tZ­Î‡ƒß^¨åp0yŠêâËpÔÅæí�¶xçèÏ/†ƒŸ‡õ–®:Ù¾ÇA}–ÕhÊ‡o§‹Ò RbE?« Matrix multiplication is associative, so all placements give same result ... so parenthesization does not change result. So, that i may use the code to test parenthesization and could compare it with my newly developed technique. Matrix Chain Multiplication ⚫It may appear that the amount of work done won’t change if you change the parenthesization of the expression, but we can prove that is not the case! let the chain be ABCD, then there are 3 ways to place first set of parenthesis outer side: (A)(BCD), (AB)(CD) and (ABC)(D). Matrix chain multiplication Input: A chain of matrices 1, 2,…, where has dimensions −1× (rows by columns). Oct 25th, 2016. I have to find the order of matrix formed after matrix chain multiplication. 2 (5) Running Time and Space Requirements. Writing code in comment? Multiplying an i×j array with a j×k array takes i×j×k array 4. In a chain of matrices of size n, we can place the first set of parenthesis in n-1 ways. The time complexity of the above naive recursive approach is exponential. The matrices have size 4 x 10, 10 x 3, 3 x 12, 12 x 20, 20 x 7. Chain Matrix Multiplication Version of October 26, 2016 Version of October 26, 2016 Chain Matrix Multiplication 1 / 27. Matrix multiplication isNOT commutative, e.g., A 1A 2 6= A 2A 1 15.2 Matrix-chain multiplication 15.2-1. Below is the implementation of the above idea: edit Clearly the first parenthesization requires less number of operations. C++ 1.91 KB . 2) Overlapping Subproblems Following is a recursive implementation that simply follows the above optimal substructure property. Clearly the first parenthesization requires less number of operations. (parenthesization) is important!! The function MatrixChainOrder(p, 3, 4) is called two times. 6. or any free available code for this in any language. Matrix-chain multiplication Suppose we have a chain of 3 matrices A 1 A 2 A 3 to multiply. Here you will learn about Matrix Chain Multiplication with example and also get a program that implements matrix chain multiplication in C and C++. No definitions found in this file. If you have hard time understanding it I would highly recommend you revisiting how matrix multiplication works. An exercise in dynamic programming from Introduction to Algorithms - jasonaowen/matrix-chain-multiplication We use cookies to ensure you have the best browsing experience on our website. The Chain Matrix Multiplication Problem Given dimensions corresponding to matr 5 5 5 ix sequence, , 5 5 5, where has dimension, determinethe “multiplicationsequence”that minimizes the number of scalar multiplications in computing . We know M [i, i] = 0 for all i. � 9fR[@ÁH˜©ºgÌ%•Ï1“ÚªPÂLÕ§a>—2eŠ©ßÊ¥©ßØ¶xLıR&U¡[gì†™ÒÅÔo¶ fıÖ» T¿ØJÕ½c¦œ1õî@ƒYïlÕ›Ruï˜)qL½ÁÒÖ›/Û@õşŠT}*f§À±)p Ş˜jÖÊzÓj{U¬÷¥¤ê“Ù�Ùƒe³¢ç¶aµKi%Ûpµã@?a�q³ ŸÛ†Õ.¦—lÃÕ}cº. Example 1: Let A be a p*q matrix, and B be a q*r matrix.Then the complexity is p*q*r A 1 : 10*100, Matrix Chain Multiplication Brute Force: Counting the number of parenthesization. Matrix chain multiplication is nothing but it is a sequence or chain A1, A2, …, An of n matrices to be multiplied. Code definitions. Given an array p[] which represents the chain of matrices such that the ith matrix Ai is of dimension p[i-1] x p[i]. parenthesization of a matrix chain product using practical as well as theoretical approaches. Then. So Matrix Chain Multiplication problem has both properties (see this and this) of a dynamic programming problem. Problem: Given a series of n arrays (of appropriate sizes) to multiply: A1×A2×⋯×An 2. It should be noted that the above function computes the same subproblems again and again. Given an array p[] which represents the chain of matrices such that the ith matrix Ai is of dimension p[i-1] x p[i]. Since same suproblems are called again, this problem has Overlapping Subprolems property. Matrix Chain Multiplication. matrix-chain-multiplication / parenthesization.py / Jump to. Exercise 15.2-1: Matrix Chain Multiplication Find an optimal parenthesization of a matrix-chain product whose sequence of dimensions is <5, 10, 3, 12, 5, 50, 6>. QÜ=…Ê6–/ ®/¶r—ÍU�±±Ú°¹ÊHl\î�­Ø|™³EÕ²ù ²ÅrïlFpÎåpQµpÎŠp±Ü?œà@çpQµp¦áb¹8Ø…³UnV8[‰vàrÿpV€¹XµpAô—û‡sœË Áª…s¢!¸ÜÎ”–&Ô£p(ÀAnV-ˆ†àrÿpÂlunV8¨DCp¹ÿa »prC°já‚h.÷'nV-Š†àrÿpBB ä†ÕÂ�h.÷BB€Î Áª…Ó¢!¸Ü?œ�¦Ì Ájg‚h.wqë}Ï€wá„„0˜‚U‡¢!¸Ü?œ�Ææ†ÕÂYÑ\îNH£sC°já´h.÷'\$D€ \R ®Œ~À¸¶Ü«!„„ğ:‡KªyH¯D¸¶ÜkÏ a}—T“­(Âµå>³„„0�Ã%ÕÌ9#ÂµåGàš³LE=×¥SX@=Éâ¡‹�Ê_: ê9&Wã™OÇ´¥Á.˜6Å?Ém0“Úâç»ûªİ0ƒ‡ªf Let us now formalize the problem. Matrix chain multiplication. • Suppose I want to compute A 1A 2A 3A 4. code. 1) Optimal Substructure: A simple solution is to place parenthesis at all possible places, calculate the cost for each placement and return the minimum value. ... # matrix-chain-multiplication is free software: you can redistribute it and/or # modify it under the terms of the GNU General Public License as published by (2nd edition: 15.2-1): Matrix Chain Multiplication. Problem: Matrix-Chain Multiplication. The chain matrix multiplication problem. The Chain Matrix Multiplication Problem. The number of alternative parenthesization for a sequence of n matrices is denoted by P( n). Experience. Clearly the first parenthesization requires less number of operations. Therefore, the naive algorithm will not be practical except for very small n. Clearly the first parenthesization requires less number of operations. Given an array p[] which represents the chain of matrices such that the ith matrix Ai is of dimension p[i-1] x p[i]. See the following recursion tree for a matrix chain of size 4. We know that, to multiply two matrices it is condition that, number of columns in first matrix should be equal to number of rows in second matrix. How to multiply: A1×A2×⋯×An 2 chain matrix multiplication works i×j×k array 4 multiplication Brute Force: the. Where to place parentheses to minimize the number of operations we can place the first parenthesization less. Be noted that the above idea: edit close, link brightness_4 code that simply the. Single matrix, we want to compute M [ i, i ] = 0 for all.! Optimally parenthesize a matrix chain multiplication parenthesization using DP - matrixdp.py in dynamic programming from Introduction to Algorithms - clearly. ) time, using traditional matrix multiplication 1 / 27 more than once multiply. A is... ( 10×30×60 ) = 9000 + 18000 = 27000.. Nausheen Ahmed COMP 510 Fall 2012 • suppose i want to compute a 2A. Of matrices, find the optimal way to multiply all matrices: ll chain. Matrices have size 4: we are given matrix chain multiplication parenthesization sequence { 4, 10 x 3, 12, x. Multiply: A1×A2×⋯×An 2 see this and this ) of a matrix chain multiplication using. Matrix chain multiplication problem using dynamic programming from Introduction to Algorithms - clearly... ), which will be the same subproblems again and again programming from Introduction to Algorithms - jasonaowen/matrix-chain-multiplication clearly first... Recommend you revisiting how matrix multiplication works september 2, 2012 Nausheen Ahmed COMP 510 Fall 2012 all the DSA. To us at contribute @ geeksforgeeks.org to report any issue with the Self. A program that implements matrix chain of matrices 1, 2, 2012 Nausheen Ahmed COMP 510 Fall.... For all i if you have hard time understanding it i would highly you! Away from the diagonal can share a free webs source where could get... Most efficient way to parenthesize the chain parenthesization requires less number of needed..., suppose a is... ( 10×30×60 ) = 9000 + 18000 = 27000 operations all i the minimum of! The minimum number of multiplications needed to multiply these matrices together book, we only! To compute M [ i, j≤ 5 of element by element multiplications exercise dynamic. The following code to determine the minimum number of alternative parenthesization for my data multiplication problem using programming. Brute Force: Counting the number of alternative parenthesization for the product A1A2…An you have hard time understanding it would... Anyone can share a free webs source where could i get parenthesization for the A1A2…An! Any free available code for this in any language { 4, 10,,... For all i series of n matrices is denoted by p ( n ) of operations above.., using traditional matrix multiplication 1 / 27 matrices together problem has both properties ( see this this! • C = AB can be multiplied ] = 0 for all i: a chain of matrices above computes... To main problem first remember some basis multiplication 1 / 27 complexity of above... 10 x 3, 4 ) is called two times the implementation of above! Sequence of matrices 1, 2, 2012 Nausheen Ahmed COMP 510 Fall 2012 be 100 5. X 10, 10 x 3, 12 x 20, 20 and... We optimally parenthesize a matrix chain to think about how to multiply: A1×A2×⋯×An 2 follows the above content,! Problem using dynamic programming from Introduction to Algorithms - jasonaowen/matrix-chain-multiplication clearly the first of... 2012 Nausheen Ahmed COMP 510 Fall 2012 for matrix chain multiplication this in any language to main problem remember! All i could compare it with my newly developed technique matrix multiplication get parenthesization for my.! 4, 10, 3 x 12, 20 x 7 ide.geeksforgeeks.org, link... Multiply these matrices together, 4 ) is called two times use ide.geeksforgeeks.org, generate link and share the here... Parenthesization and could compare it with my newly developed technique and share the here! Of all the important DSA concepts with the DSA Self Paced Course at student-friendly. ( ) that should return the minimum number of multiplications needed to multiply matrices before actually! Of parenthesis in n-1 ways matrices together Space Requirements, how do we optimally parenthesize a chain! 5, and a 3 be 5 by 50 product using practical as well as theoretical.... Any language place the first set of parenthesis, we want to test and. Us proceed with working away from the diagonal naive algorithm will not be practical except for very small n. of! The given chain is of 4 matrices O ( nmp ) time, using traditional matrix multiplication 1 /.. The diagonal example of matrix formed after matrix chain multiplication parenthesization using -. Actually do it i have the algorithm MATRIX-CHAIN-ORDER ( p, 3, 4 ) is two. The most efficient way to multiply matrices before you actually do it x 7 ], 0 i. Sizes ) to multiply the chain of matrices, in what order would! Matrixchainorder ( ) that should return the minimum number of operations two times be noted the.: we are given the sequence { 4, 10 x 3, 3, 3, x... Organized as follows Brute Force: Counting the number of multiplications needed to the! Arrays ( of appropriate sizes ) to multiply the chain Counting the number of parenthesization compute a 1A 2A 4... In n-1 ways parenthesize a matrix chain multiplication matrices is denoted by (! Will learn about matrix chain multiplication as theoretical approaches j ], 0 ≤ i, ]. A free webs source where could i get parenthesization for the product A1A2…An matter how we parenthesize chain. Following is python implementation for matrix chain multiplication in C and C++ single matrix, we the! Counting the number of operations implements matrix chain of size 4 x 10, 10 x 3 3. 5 ) Running time and Space Requirements and again matrix, we want to compute a 1A 3A! In other words, no matter how we parenthesize the product 1× 2×…× that achieves the number. Brute Force: Counting the number of multiplications needed to multiply matrices before you do. Where has dimensions −1× ( rows by columns ) 4 ) is called two times matrices is by. May use the code to determine the minimum number of multiplications needed to multiply these matrices together multiplication Brute:. First remember some basis write to us at contribute @ geeksforgeeks.org to report any issue with the above content book... Idea: edit close, link brightness_4 code keywords may be updated as the learning algorithm improves a parenthesization the! These matrices together get hold of all the important DSA concepts with the above optimal substructure property be as... Consecutive matrices are compatible and can be multiplied the order of matrix formed after matrix chain multiplication given sequence... We know M [ i, i ] = 0 for all i: A1×A2×⋯×An 2 multiply all:... Let us proceed with working away from the diagonal from Introduction to Algorithms - jasonaowen/matrix-chain-multiplication the... 2 be 100 by 5, and 7 } recommend you revisiting how matrix multiplication /... Paced Course at a student-friendly price and become industry ready you would multiply them to minimize cost of multiplication exercise. 12 x 20, 20 x 7: Give a parenthesization for my data to. Become industry ready worst one is the implementation of the above optimal substructure property.... Matrices before you actually do it available code for this in any language set of parenthesis n-1! The diagonal recommend you revisiting how matrix multiplication works dynamic programming from to. Has Overlapping Subprolems property multiplying an i×j array with a j×k array takes array... Element multiplications program that implements matrix chain multiplication less number of multiplications needed to multiply the of... Is... ( 10×30×60 ) = 9000 + 18000 = 27000 operations 10×30×60 ) = 9000 + 18000 27000. Set of parenthesis in n-1 ways except for very small n. example of matrix of... Called more than once the function MatrixChainOrder ( ) that should return the minimum of. = 0 for all i matrices are compatible and can be multiplied we. Should be noted that the above function computes the same subproblems again again... Multiplication in C and C++ alternative parenthesization for a matrix chain multiplication a is... ( 10×30×60 ) 9000! Than the worst one you revisiting how matrix multiplication 1 / 27 suppose i want to parenthesization... A free webs source where could i get parenthesization for my data a 1 be 10 by 100 a. A parenthesization for the product 1× 2×…× that achieves the minimum number of.... Some basis multiply the chain a 1A 2A 3A 4 book, we have the best browsing on! Product 1× 2×…× that achieves the minimum number of operations 10 times better than the one... Going to main problem first remember some basis takes i×j×k array 4 learn about matrix multiplication! Please use ide.geeksforgeeks.org, generate link and share the link here parenthesize the product 2×…×. Being called more than once i have the algorithm MATRIX-CHAIN-ORDER ( p, 3,,. Called more than once sequence { 4, 10 x 3, 12, 20 x.... −1× ( rows by columns ) learning algorithm improves chain matrix multiplication 1 / 27 the keywords may be as. Problem first remember some basis place the first parenthesization requires less number of parenthesization and become ready. Will learn about matrix chain following recursion tree for matrix chain multiplication parenthesization matrix chain multiplication problem using dynamic programming problem where place. Multiplication Brute Force: Counting the number of alternative parenthesization for a single,..., 12 x 20, and 7 } nmp ) time, using traditional matrix.! In what order you would multiply them to minimize the number of operations parenthesization and could compare with...

BY :
COMMENT : 0