prime number testing

here is a simple test for primality for 32 bit integers.

unsigned int mulmod(unsigned int a, unsigned int b, unsigned int m);
int isPrime(unsigned int n)
{
    /* given `n' determine whether it is prime.
     * return 0 => composite. 1 => prime.
     *
     * method:
     * when n is odd > 7, determine if it is a strong pseudoprime
     * to bases 2, 3, 5 & 7. if not then we are composite.
     * otherwise we are prime because n < 25x10^9 except for one
     * exception, specially tested.
     */
    unsigned int r, s;
    int i, j;
    unsigned int a;
    if (n < 2) return 0;
    if (n == 2) return 1;
    /* only spsp < 25x10^9 with bases 2, 3, 5 & 7 */
    if (n == 3215031751) return 0;
    s = n - 1;
    r = 0;
    for (;;) {
        unsigned int c = s/2;
        if (c*2 == s) {
            ++r;
            s = c;
        }
        else break;
    }
    if (!r) return 0;
    --r;
    a = 0;
    for (;;) {
        unsigned int b;
        unsigned int y;
        unsigned int z;
        a += 2;
        if (a == 9) break;
        else if (a == 4) a = 3;        
        if (n == a) break;
        b = 1;
        z = a;
        y = s;
        for (;;) {
            unsigned int c = y/2;
            if (c*2 != y) {
                b = mulmod(z, b, n);
            }
            if (!c) break;
            y = c;
            z = mulmod(z, z, n);
        }
        if (b == 1 || b == n-1) continue;
        for (j = 0; j < r; ++j) {
            b = mulmod(b, b, n);
            if (b == n-1) break;
        }
        if (j == r) return 0;
    }
    return 1;
}
unsigned int mulmod(unsigned int a, unsigned int b, unsigned int m)
{
    /* return a*b (mod m).
     * take special care of unsigned quantities and overflow.
     */
    unsigned int z;
    unsigned int y = a;
    int t;
    z = 0;
    for (;;) {
        unsigned int c = b/2;
        if (c*2 != b) {
            z += y;
            if (z < y || z >= m) z -=m;
        }
        b = c;
        if (!b) break;
        t = y;
        y <<= 1;
        if (t < 0 || y >= m) y -= m;
    }
    return z;
}