listing 1 The simplest square root. unsigned long sqrt(unsigned long a){ unsigned long x = 1; while(x*x <= a) ++x; return ‹x; } listing 2 Improving efficiency. unsigned long sqrt(unsigned long a){ unsigned long square = 1; unsigned long delta = 3; while(square <= a){ square += delta; delta += 2; } return (delta/2 - 1); } listing 3 The binary square root. unsigned short sqrt(unsigned long a){ unsigned long rem = 0; unsigned long root = 0; unsigned long divisor = 0; for(int i=0; i<16; i++){ root <<= 1; rem = ((rem << 2) + (a >> 30)); a <<= 2; divisor = (root<<1) + 1; if(divisor <= rem){ rem -= divisor; root++; } } return (unsigned short)(root); } listing 4 An improved version. unsigned short sqrt(unsigned long a){ unsigned long rem = 0; unsigned long root = 0; for(int i=0; i<16; i++){ root <<= 1; rem = ((rem << 2) + (a >> 30)); a <<= 2; root ++; if(root <= rem){ rem -= root; root++; } else root‹; } return (unsigned short)(root >> 1); }