public Row cancelColumn(final int index,
                                final Row otherrow,
                                final BigInteger useModulus)
        {
            // special case: our col[index] is already zero:
            if (this.isColumnZero(index))
            {
                return this;
            }


            boolean samesign = this.sameSign(index, otherrow);
            BigInteger mult = this.getColumn(index);
            if (samesign)
            {
                mult = mult.negate();
            }
            Row cancel = otherrow.multiplyConstant(mult);

            mult = otherrow.getColumn(index);
            Row usethis = this.multiplyConstant(mult);
            if (! samesign)
            {
                usethis = usethis.negate();
            }

            Row ret = null;
            if (! usethis.sameSign(index, cancel))
            {
                ret = usethis.add(cancel);

                if (useModulus != null)
                {
                    if (ret.cols[0].signum() == -1)
                    {
                        // modfix: not proven to reduce errors: mod down the column value
                        //ret.cols[0] = ret.cols[0].mod(useModulus);

                        // modfix: let's try keeping cols[0] positive:
                        usethis = usethis.negate();
                        cancel = cancel.negate();
                        ret = usethis.add(cancel);
                    }
                }
            }
            else
            {
                throw new SecretShareException("prog error this(" + index + ")=" +
                                               this.getColumn(index) +
                                               " other(" + index + ")=" +
                                               cancel.getColumn(index));
            }
            return ret;
        }