def _convertToMonicNf(nf, timeout):

    pariStr = "PRIVATEconvertToMonicNf = nfinit(%s, 3)" % nf.printMagma()
    print pariStr
    print timeout
    r       = pari.pari_eval(pariStr, timeout = timeout)
    nf      = Polynomial.parseFromMagma(
        pari.pari_eval("PRIVATEconvertToMonicNf[1].pol", timeout = timeout))
    newExpressionForX = Polynomial.parseFromMagma(
        pari.pari_eval("PRIVATEconvertToMonicNf[2].pol", timeout = timeout))

    return nf, newExpressionForX
def _solveExactlyOverNumberField(univariatePoly, nf, timeout):
    
    variable = univariatePoly.variables()[0]

    def convertXtoY(p):
        return p.substitute({'x' : Polynomial.fromVariableName('y')})

    univariatePoly = univariatePoly.convertCoefficients(convertXtoY)
    univariatePoly = univariatePoly.substitute(
        { variable : Polynomial.constantPolynomial(
            Polynomial.fromVariableName('x'))})

    if not nf:
        assert univariatePoly.isConstant()
        newSolution       = Polynomial.fromVariableName('x')
        newNf             = univariatePoly.getConstant()
        newExpressionForX = Polynomial.constantPolynomial(0)
    else:
        nf = convertXtoY(nf)

        pariStr = "PRIAVTEsEONF = rnfequation(nfinit(%s), %s, 1)" % (
            nf, univariatePoly)

        print pariStr
        print timeout
        r = pari.pari_eval(pariStr, timeout = timeout)
        # print r

        newNf              = Polynomial.parseFromMagma(pari.pari_eval(
                "PRIAVTEsEONF[1]", timeout = timeout))
        newExpressionForX  = Polynomial.parseFromMagma(pari.pari_eval(
                "PRIAVTEsEONF[2].pol", timeout = timeout))
        factor             = int(pari.pari_eval(
                "PRIAVTEsEONF[3]", timeout = timeout))
        newSolution = (
            Polynomial.fromVariableName('x')
            - Polynomial.constantPolynomial(factor) * newExpressionForX)

    return newSolution, newNf, newExpressionForX
def main():
    parser = create_parser()
    # Parse command line options

    options, args = parser.parse_args()

    if not len(args) == 1:
        parser.print_help()
        sys.exit(1)

    filename = args[0]

    if filename[-4:] == ".csv":
        outFilenameBase = filename[:-4]
    else:
        outFilenameBase = filename

    outFilename = outFilenameBase + "_complexPlaces.csv"

    print "output to", outFilename

    censusTable = readCensusTable(filename, convertData=False)

    fieldnames = censusTable.header
    if not "NumberOfComplexPlaces" in fieldnames:
        fieldnames = fieldnames + ["NumberOfComplexPlaces"]

    csv_writer = csv.DictWriter(open(outFilename, "w"), fieldnames=fieldnames)

    csv_writer.writerow(dict(zip(fieldnames, fieldnames)))

    for row in censusTable.listOfDicts:
        if row.has_key("InvariantTraceField"):
            if row["InvariantTraceField"] and not row["InvariantTraceField"] == "-":

                pariStr = "nfinit(%s).r2" % row["InvariantTraceField"]

                row["NumberOfComplexPlaces"] = pari.pari_eval(pariStr)

        csv_writer.writerow(row)
OutWriter.writerow( dict(zip(RepresentationHeader, 
                             RepresentationHeader)))

for d in RepresentationReader:
    d['Linear Combinations'] = '-'
    if d['Volume'] and not d['Volume'] == '-':
        v = number(d['Volume'])
        vfloat = float(d['Volume'])
        if vfloat > 1e-10:

            pari_cmd = ("lindep([%s],%d)" 
                          % (','.join([str(x) 
                                       for x in 
                                       volDict.values() + [v]]),
                             precision))
            s = pari_eval(pari_cmd) 
            if d['Manifold'] == '4_1' and False:
                print s
                print v
                print len(volDict.values() + [v])
            assert s[0] == '['
            assert s[-2:] == ']~'
            s = [int(x) for x in s[1:-2].split(',')]
            k = max([max(s),-min(s)])
            if k < 1000:
                q = '('
                q+= '+'.join(['(%d) * %s' % x for x in zip(s[:-1], volDict.keys()) if x[0]])
                q+= ') / (%d)' % s[-1]

                d['Linear Combinations'] = q