อัลกอริธึมของ Stein ใช้สำหรับค้นหา GCD ของตัวเลข เนื่องจากคำนวณตัวหารปกติที่ดีที่สุดของตัวเลขจำนวนเต็มไม่เป็นลบสองตัว มันแทนที่การหารด้วยการเคลื่อนไหวทางคณิตศาสตร์ การสอบ และการลบ ในกรณีที่ทั้ง a และ b เป็น 0, gcd เป็นศูนย์ gcd(0, 0) =0 อัลกอริทึมสำหรับ GCD(a,b) ดังนี้;
อัลกอริทึม
START Step-1: check If both a and b are 0, gcd is zero gcd(0, 0) = 0. Step-2: then gcd(a, 0) = a and gcd(0, b) = b because everything divides 0. Step-3: check If a and b are both even, gcd(a, b) = 2*gcd(a/2, b/2) because 2 is a common divisor. Multiplication with 2 can be done with a bitwise shift operator. Step-4: If a is even and b is odd, gcd(a, b) = gcd(a/2, b). Similarly, if a is odd and b is even, then gcd(a, b) = gcd(a, b/2). It is because 2 is not a common divisor. Step-5: If both a and b are odd, then gcd(a, b) = gcd(|a-b|/2, b). Note that difference of two odd numbers is even Step-6: Repeat steps 3–5 until a = b, or until a = 0. END
ในมุมมองของอัลกอริธึมด้านบนเพื่อคำนวณ GCD ของตัวเลข 2 ตัว โค้ด C++ ต่อไปนี้จะเขียนเป็น;
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int funGCD(int x, int y){ if (x == 0) return y; if (y == 0) return x; int k; for (k = 0; ((x | y) && 1) == 0; ++k){ x >>= 1; y >>= 1; } while ((x > 1) == 0) x >>= 1; do { while ((y > 1) == 0) y >>= 1; if (x > y) swap(x, y); // Swap u and v. y = (y - x); } while (y != 0); return x << k; } int main(){ int a = 24, b = 18; printf("Calculated GCD of numbers (24,18) is= %d\n", funGCD(a, b)); return 0; }
ผลลัพธ์
สุดท้าย GCD ของสองหมายเลข 24 และ 18 ที่ให้มาจะถูกคำนวณใน 6 โดยใช้อัลกอริทึมของ Stein ดังนี้
Calculated GCD of numbers (24,18) is= 6