📄 atl_lcm.c
字号:
/* * Automatically Tuned Linear Algebra Software v3.8.0 * (C) Copyright 1999 R. Clint Whaley * * Code contributers : R. Clint Whaley, Antoine P. Petitet * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the ATLAS group or the names of its contributers may * not be used to endorse or promote products derived from this * software without specific written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */int ATL_lcm(const int M, const int N)/* * Returns least common multiple (LCM) of two positive integers M & N by * computing greatest common divisor (GCD) and using the property that * M*N = GCD*LCM. */{ register int tmp, max, min, gcd=0; if (M != N) { if (M > N) { max = M; min = N; } else { max = N; min = M; } if (min > 0) /* undefined for negative numbers */ { do /* while (min) */ { if ( !(min & 1) ) /* min is even */ { if ( !(max & 1) ) /* max is also even */ { do { min >>= 1; max >>= 1; gcd++; if (min & 1) goto MinIsOdd; } while ( !(max & 1) ); } do min >>=1 ; while ( !(min & 1) ); }/* * Once min is odd, halve max until it too is odd. Then, use * property that gcd(max, min) = gcd(max, (max-min)/2) * for odd max & min */MinIsOdd: if (min != 1) { do /* while (max >= min */ { max -= (max & 1) ? min : 0; max >>= 1; } while (max >= min); } else return( (M*N) / (1<<gcd) ); tmp = max; max = min; min = tmp; } while(tmp); } return( (M*N) / (max<<gcd) ); } else return(M);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -