protected void realInverse2(float[] a, int offa, boolean scale) {
        if (n == 1)
            return;
        switch (plan) {
        case SPLIT_RADIX:
            float xi;

            if (n > 4) {
                cftfsub(n, a, offa, ip, nw, w);
                rftbsub(n, a, offa, nc, w, nw);
            } else if (n == 4) {
                cftbsub(n, a, offa, ip, nw, w);
            }
            xi = a[offa] - a[offa + 1];
            a[offa] += a[offa + 1];
            a[offa + 1] = xi;
            if (scale) {
                scale(n, a, offa, false);
            }
            break;
        case MIXED_RADIX:
            rfftf(a, offa);
            for (int k = n - 1; k >= 2; k--) {
                int idx = offa + k;
                float tmp = a[idx];
                a[idx] = a[idx - 1];
                a[idx - 1] = tmp;
            }
            if (scale) {
                scale(n, a, offa, false);
            }
            int m;
            if (n % 2 == 0) {
                m = n / 2;
                for (int i = 1; i < m; i++) {
                    int idx = offa + 2 * i + 1;
                    a[idx] = -a[idx];
                }
            } else {
                m = (n - 1) / 2;
                for (int i = 0; i < m; i++) {
                    int idx = offa + 2 * i + 1;
                    a[idx] = -a[idx];
                }
            }
            break;
        case BLUESTEIN:
            bluestein_real_inverse2(a, offa);
            if (scale) {
                scale(n, a, offa, false);
            }
            break;
        }
    }