1 /*
2    Copyright (c) 2009-2014, Jack Poulson
3    All rights reserved.
4 
5    This file is part of Elemental and is under the BSD 2-Clause License,
6    which can be found in the LICENSE file in the root directory, or at
7    http://opensource.org/licenses/BSD-2-Clause
8 */
9 #pragma once
10 #ifndef ELEM_GCDMATRIX_HPP
11 #define ELEM_GCDMATRIX_HPP
12 
13 namespace elem {
14 
15 template<typename T>
16 inline void
MakeGCDMatrix(Matrix<T> & G)17 MakeGCDMatrix( Matrix<T>& G )
18 {
19     DEBUG_ONLY(CallStackEntry cse("MakeGCDMatrix"))
20     const Int m = G.Height();
21     const Int n = G.Width();
22     for( Int j=0; j<n; ++j )
23         for( Int i=0; i<m; ++i )
24             G.Set( i, j, T(GCD(i+1,j+1)) );
25 }
26 
27 template<typename T,Dist U,Dist V>
28 inline void
MakeGCDMatrix(DistMatrix<T,U,V> & G)29 MakeGCDMatrix( DistMatrix<T,U,V>& G )
30 {
31     DEBUG_ONLY(CallStackEntry cse("MakeGCDMatrix"))
32     const Int localHeight = G.LocalHeight();
33     const Int localWidth = G.LocalWidth();
34     for( Int jLoc=0; jLoc<localWidth; ++jLoc )
35     {
36         const Int j = G.GlobalCol(jLoc);
37         for( Int iLoc=0; iLoc<localHeight; ++iLoc )
38         {
39             const Int i = G.GlobalRow(iLoc);
40             G.SetLocal( iLoc, jLoc, T(GCD(i+1,j+1)) );
41         }
42     }
43 }
44 
45 template<typename T,Dist U,Dist V>
46 inline void
MakeGCDMatrix(BlockDistMatrix<T,U,V> & G)47 MakeGCDMatrix( BlockDistMatrix<T,U,V>& G )
48 {
49     DEBUG_ONLY(CallStackEntry cse("MakeGCDMatrix"))
50     const Int localHeight = G.LocalHeight();
51     const Int localWidth = G.LocalWidth();
52     for( Int jLoc=0; jLoc<localWidth; ++jLoc )
53     {
54         const Int j = G.GlobalCol(jLoc);
55         for( Int iLoc=0; iLoc<localHeight; ++iLoc )
56         {
57             const Int i = G.GlobalRow(iLoc);
58             G.SetLocal( iLoc, jLoc, T(GCD(i+1,j+1)) );
59         }
60     }
61 }
62 
63 template<typename T>
64 inline void
GCDMatrix(Matrix<T> & G,Int m,Int n)65 GCDMatrix( Matrix<T>& G, Int m, Int n )
66 {
67     DEBUG_ONLY(CallStackEntry cse("GCDMatrix"))
68     G.Resize( m, n );
69     MakeGCDMatrix( G );
70 }
71 
72 template<typename T,Dist U,Dist V>
73 inline void
GCDMatrix(DistMatrix<T,U,V> & G,Int m,Int n)74 GCDMatrix( DistMatrix<T,U,V>& G, Int m, Int n )
75 {
76     DEBUG_ONLY(CallStackEntry cse("GCDMatrix"))
77     G.Resize( m, n );
78     MakeGCDMatrix( G );
79 }
80 
81 template<typename T,Dist U,Dist V>
82 inline void
GCDMatrix(BlockDistMatrix<T,U,V> & G,Int m,Int n)83 GCDMatrix( BlockDistMatrix<T,U,V>& G, Int m, Int n )
84 {
85     DEBUG_ONLY(CallStackEntry cse("GCDMatrix"))
86     G.Resize( m, n );
87     MakeGCDMatrix( G );
88 }
89 
90 } // namespace elem
91 
92 #endif // ifndef ELEM_GCDMATRIX_HPP
93