9
0
Fork 0

lib: Add gcd() function

It calculates greatest common divisor.

Signed-off-by: Andrey Panov <rockford@yandex.ru>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Andrey Panov 2015-03-04 23:11:29 +03:00 committed by Sascha Hauer
parent 09c4b63aa2
commit 78d030226d
4 changed files with 32 additions and 0 deletions

8
include/linux/gcd.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef _GCD_H
#define _GCD_H
#include <linux/kernel.h>
unsigned long gcd(unsigned long a, unsigned long b) __attribute_const__;
#endif /* _GCD_H */

View File

@ -257,5 +257,10 @@ static inline char *hex_byte_pack_upper(char *buf, u8 byte)
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
/*
* swap - swap value of @a and @b
*/
#define swap(a, b) \
do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
#endif /* _LINUX_KERNEL_H */

View File

@ -51,3 +51,4 @@ obj-$(CONFIG_STMP_DEVICE) += stmp-device.o
obj-y += wchar.o
obj-y += libfile.o
obj-y += bitmap.o
obj-y += gcd.o

18
lib/gcd.c Normal file
View File

@ -0,0 +1,18 @@
#include <linux/gcd.h>
/* Greatest common divisor */
unsigned long gcd(unsigned long a, unsigned long b)
{
unsigned long r;
if (a < b)
swap(a, b);
if (!b)
return a;
while ((r = a % b) != 0) {
a = b;
b = r;
}
return b;
}