Révision 87 pobysoPythonSage/src/sageSLZ/sagePolynomialOperations.sage

sagePolynomialOperations.sage (revision 87)
1 1
load "/home/storres/recherche/arithmetique/pobysoPythonSage/src/sageSLZ/sageMatrixOperations.sage"
2

  
2
print "sagePolynomialOperations loading..."
3 3
def spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
4 4
                                            pCoefficients, 
5 5
                                            knownMonomials, 
......
107 107
    return(expressionAsString)
108 108
# End spo_expression_as_string.
109 109

  
110
def spo_norm(poly, degree):
110
def spo_norm(poly, p=2):
111 111
    """
112 112
    Behaves more or less (no infinity defined) as the norm for the
113 113
    univariate polynomials.
......
115 115
    Definition: For integer p, the p-norm of a polynomial is the pth root of 
116 116
    the sum of the pth powers of the absolute values of the coefficients of 
117 117
    the polynomial.
118
    
118 119
    """
119
    # TODO: check the arguments.
120
    # TODO: check the arguments (for p see below)..
120 121
    norm = 0
122
    # For infinity norm.
123
    if p == Infinity:
124
        for coefficient in poly.coefficients():
125
            coefficientAbs = coefficient.abs()
126
            if coefficientAbs > norm:
127
                norm = coefficientAbs
128
        return norm
129
    # TODO: check here the value of p
130
    # For 1 norm.
131
    if p == 1:
132
        for coefficient in poly.coefficients():
133
            norm +=  coefficient.abs()
134
        return norm
135
    # For other norms
121 136
    for coefficient in poly.coefficients():
122
        norm +=  (coefficient^degree).abs()
123
    return pow(norm, 1/degree)
137
        norm +=  (coefficient^p).abs()
138
    return pow(norm, 1/p)
124 139
# end spo_norm
125 140

  
126 141
def spo_polynomial_to_proto_matrix(p, pRing, alpha, N, columnsWidth=0):
127 142
    """
128 143
    From a (bivariate) polynomial and some other parameters build a proto 
129
    matrix (an array of rows) to be converted into a "true" matrix and 
144
    matrix (an array of "rows") to be converted into a "true" matrix and 
130 145
    eventually by reduced by fpLLL.
131 146
    The matrix is such as those found in Boneh-Durphee and Stehl?.
132 147
    
133 148
    Parameters
134 149
    ----------
135
    p: the (bivariate) polynomial
136
    pRing:
150
    p: the (bivariate) polynomial;
151
    pRing: the ring over which p is defined;
137 152
    alpha:
138 153
    N:
139 154
    columsWidth: if == 0, no information is displayed, otherwise data is 
......
144 159
    pVariables = p.variables()
145 160
    iVariable = pVariables[0]
146 161
    tVariable = pVariables[1]
147
    polynomialAtPower = P(1)
148
    currentPolynomial = P(1)
162
    polynomialAtPower = pRing(1)
163
    currentPolynomial = pRing(1)
149 164
    pIdegree = p.degree(pVariables[0])
150 165
    pTdegree = p.degree(pVariables[1])
151
    currentIdegree = currentPolynomial.degree(i)
166
    currentIdegree = currentPolynomial.degree(iVariable)
152 167
    nAtPower = N^alpha
153 168
    # We work from p^0 * N^alpha to p^alpha * N^0
154 169
    for pPower in xrange(0, alpha + 1):
......
209 224
            # possible, one step short of the degree in i of p^(pPower+1) .
210 225
            # These "pure" i^k monomials can only show up with i multiplications.
211 226
            for iPower in xrange(1, pIdegree):
212
                print "->", spo_expression_as_string(iPower, 0, pPower, alpha)
227
                if columnsWidth != 0:
228
                    print "->", spo_expression_as_string(iPower, \
229
                                                         0,      \
230
                                                         pPower, \
231
                                                         alpha)
213 232
                currentExpression = i^iPower * nAtPower
214
                currentPolynomial = P(currentExpression) * polynomialAtPower
233
                currentPolynomial = pRing(currentExpression) * polynomialAtPower
215 234
                pMonomials = currentPolynomial.monomials()
216 235
                pCoefficients = currentPolynomial.coefficients()
217
                spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
218
                                                        pCoefficients, 
219
                                                        knownMonomials, 
220
                                                        protoMatrixRows, 
236
                spo_add_polynomial_coeffs_to_matrix_row(pMonomials,      \
237
                                                        pCoefficients,   \
238
                                                        knownMonomials,  \
239
                                                        protoMatrixRows, \
221 240
                                                        columnsWidth)
222 241
            # End for iPower
223 242
            # We want now to introduce a t * p^pPower polynomial. But before
......
232 251
                                                         0,  
233 252
                                                         alpha)
234 253
                currentExpression = i^(iPower * pIdegree) * t^tPower * nAtPower
235
                currentPolynomial = P(currentExpression)
254
                currentPolynomial = pRing(currentExpression)
236 255
                pMonomials = currentPolynomial.monomials()
237 256
                pCoefficients = currentPolynomial.coefficients()
238 257
                spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
......
264 283
                                                             0,
265 284
                                                             alpha)
266 285
                    currentExpression = i^iPower * t^outerTpower * nAtPower
267
                    currentPolynomial = P(currentExpression)
286
                    currentPolynomial = pRing(currentExpression)
268 287
                    pMonomials = currentPolynomial.monomials()
269 288
                    pCoefficients = currentPolynomial.coefficients()
270 289
                    spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
......
295 314
                                                                     alpha) 
296 315
                            currentExpression = \
297 316
                                    i^(iPower) * t^(innerTpower) * nAtPower
298
                            currentPolynomial = P(currentExpression)
317
                            currentPolynomial = pRing(currentExpression)
299 318
                            pMonomials = currentPolynomial.monomials()
300 319
                            pCoefficients = currentPolynomial.coefficients()
301 320
                            spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
......
321 340
                                                             pPower,
322 341
                                                             alpha)
323 342
                    currentExpression = i^iShift * t^outerTpower * nAtPower
324
                    currentPolynomial = P(currentExpression) * polynomialAtPower
343
                    currentPolynomial = pRing(currentExpression) * polynomialAtPower
325 344
                    pMonomials = currentPolynomial.monomials()
326 345
                    pCoefficients = currentPolynomial.coefficients()
327 346
                    spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
......
335 354
        polynomialAtPower *= p  
336 355
        nAtPower /= N
337 356
    # End for pPower loop
338
    return protoMatrixRows
357
    return ((protoMatrixRows, knownMonomials))
339 358
# End spo_polynomial_to_proto_matrix
340 359

  
341
def spo_proto_to_column_matrix(protoMatrixRows):
360
def spo_proto_to_column_matrix(protoMatrixColumns):
342 361
    """
343
    Create a row (each column holds the coefficients of one polynomial) matrix.
362
    Create a column (each row holds the coefficients of one monomial) matrix.
344 363
    protoMatrixRows.
345 364
    
346 365
    Parameters
347 366
    ----------
348
    protoMatrixRows: a list of coefficient lists.
367
    protoMatrixColumns: a list of coefficient lists.
349 368
    """
350
    numRows = len(protoMatrixRows)
351
    if numRows == 0:
369
    numColumns = len(protoMatrixColumns)
370
    if numColumns == 0:
352 371
        return None
353
    numColumns = len(protoMatrixRows[numRows-1])
372
    # The last column holds has the maximum length. 
373
    numRows = len(protoMatrixColumns[numColumns-1])
354 374
    if numColumns == 0:
355 375
        return None
356 376
    baseMatrix = matrix(ZZ, numRows, numColumns)
357
    for rowIndex in xrange(0, numRows):
358
        if monomialLengthChars != 0:
359
            print protoMatrixRows[rowIndex]
360
        for colIndex in xrange(0, len(protoMatrixRows[rowIndex])):
361
            baseMatrix[colIndex, rowIndex] = protoMatrixRows[rowIndex][colIndex]
377
    for colIndex in xrange(0, numColumns):
378
        for rowIndex in xrange(0, len(protoMatrixColumns[colIndex])):
379
            baseMatrix[rowIndex, colIndex] = \
380
            protoMatrixColumns[colIndex][rowIndex]
362 381
    return baseMatrix
363 382
# End spo_proto_to_column_matrix.
364 383
#
365 384
def spo_proto_to_row_matrix(protoMatrixRows):
366 385
    """
367
    Create a row (each row holds the coefficients of one polynomial) matrix.
386
    Create a row (each column holds the coefficients of one monomial) matrix.
368 387
    protoMatrixRows.
369 388
    
370 389
    Parameters
......
379 398
        return None
380 399
    baseMatrix = matrix(ZZ, numRows, numColumns)
381 400
    for rowIndex in xrange(0, numRows):
382
        if monomialLengthChars != 0:
383
            print protoMatrixRows[rowIndex]
384 401
        for colIndex in xrange(0, len(protoMatrixRows[rowIndex])):
385 402
            baseMatrix[rowIndex, colIndex] = protoMatrixRows[rowIndex][colIndex]
386 403
    return baseMatrix
387 404
# End spo_proto_to_row_matrix.
388 405
#
389
print "sagePolynomialOperations loaded..."
406
print "\t...sagePolynomialOperations loaded"

Formats disponibles : Unified diff