Révision 83

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

  
3
def spo_add_polynomial_coeffs_to_matrix(pMonomials, 
4
                                        pCoefficients, 
5
                                        knownMonomials, 
6
                                        protoMatrixRows, 
7
                                        columnsWidth=0):
3
def spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
4
                                            pCoefficients, 
5
                                            knownMonomials, 
6
                                            protoMatrixRows, 
7
                                            columnsWidth=0):
8 8
    """
9 9
    For a given polynomial (under the form of monomials and coefficents lists),
10 10
    add the coefficients of the protoMatrix (a list of proto matrix rows).
11 11
    Coefficients are added to the protoMatrix row in the order imposed by the 
12 12
    monomials discovery list (the knownMonomials list) built as construction
13 13
    goes on. 
14
    As a bonus data can be printed out for a visual check.
14
    As a bonus, data can be printed out for a visual check.
15 15
    pMonomials     : the list of the monomials coming form some polynomial;
16 16
    pCoefficients  : the list of the corresponding coefficients to add to
17 17
                     the protoMatrix in the exact same order as the monomials;
......
82 82
    protoMatrixRows.append(protoMatrixRowCoefficients)
83 83
    if columnsWidth != 0:
84 84
        print    
85
# End spo_add_polynomial_coeffs_to_matrix
85
# End spo_add_polynomial_coeffs_to_matrix_row
86 86

  
87 87
def spo_expression_as_string(powI, powT, powP, alpha):
88 88
    """
......
123 123
    return pow(norm, 1/degree)
124 124
# end spo_norm
125 125

  
126
def spo_polynomial_to_matrix(p, pRing, alpha, N, columnsWidth=0):
126
def spo_polynomial_to_proto_matrix(p, pRing, alpha, N, columnsWidth=0):
127 127
    """
128
    From a (bivariate) polynomial and some other parameters build a matrix
129
    to be reduced by fpLLL.
128
    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 
130
    eventually by reduced by fpLLL.
130 131
    The matrix is such as those found in Boneh-Durphee and Stehl?.
131 132
    
133
    Parameters
134
    ----------
132 135
    p: the (bivariate) polynomial
136
    pRing:
133 137
    alpha:
134 138
    N:
135
    
139
    columsWidth: if == 0, no information is displayed, otherwise data is 
140
                 printed in colums of columnsWitdth width.
136 141
    """
137 142
    knownMonomials = []
138 143
    protoMatrixRows = []
......
172 177
                                        polynomialAtPower 
173 178
                    pMonomials = currentPolynomial.monomials()
174 179
                    pCoefficients = currentPolynomial.coefficients()
175
                    spo_add_polynomial_coeffs_to_matrix(pMonomials, 
176
                                                        pCoefficients, 
177
                                                        knownMonomials, 
178
                                                        protoMatrixRows, 
179
                                                        columnsWidth)
180
                    spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
181
                                                            pCoefficients, 
182
                                                            knownMonomials, 
183
                                                            protoMatrixRows, 
184
                                                            columnsWidth)
180 185
                # End tPower.
181 186
            # End for iPower.
182 187
        else: # pPower > 0: (p^1..p^alpha)
......
190 195
            currentPolynomial = polynomialAtPower * nAtPower
191 196
            pMonomials = currentPolynomial.monomials()
192 197
            pCoefficients = currentPolynomial.coefficients()
193
            spo_add_polynomial_coeffs_to_matrix(pMonomials, 
194
                                                pCoefficients, 
195
                                                knownMonomials, 
196
                                                protoMatrixRows, 
197
                                                columnsWidth)
198
            spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
199
                                                    pCoefficients, 
200
                                                    knownMonomials, 
201
                                                    protoMatrixRows, 
202
                                                    columnsWidth)
198 203
            
199 204
            # The i^iPower * p^pPower polynomials: they add i^k monomials to  
200 205
            # p^pPower up to k < pIdegree * pPower. This only introduces i^k 
......
209 214
                currentPolynomial = P(currentExpression) * polynomialAtPower
210 215
                pMonomials = currentPolynomial.monomials()
211 216
                pCoefficients = currentPolynomial.coefficients()
212
                spo_add_polynomial_coeffs_to_matrix(pMonomials, 
213
                                                    pCoefficients, 
214
                                                    knownMonomials, 
215
                                                    protoMatrixRows, 
216
                                                    columnsWidth)
217
                spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
218
                                                        pCoefficients, 
219
                                                        knownMonomials, 
220
                                                        protoMatrixRows, 
221
                                                        columnsWidth)
217 222
            # End for iPower
218 223
            # We want now to introduce a t * p^pPower polynomial. But before
219 224
            # that we must introduce some mixed monomials.
......
230 235
                currentPolynomial = P(currentExpression)
231 236
                pMonomials = currentPolynomial.monomials()
232 237
                pCoefficients = currentPolynomial.coefficients()
233
                spo_add_polynomial_coeffs_to_matrix(pMonomials, 
234
                                                    pCoefficients, 
235
                                                    knownMonomials, 
236
                                                    protoMatrixRows, 
237
                                                    columnsWidth)
238
                spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
239
                                                        pCoefficients, 
240
                                                        knownMonomials, 
241
                                                        protoMatrixRows, 
242
                                                        columnsWidth)
238 243
            # End for iPower
239 244
            #
240 245
            # This is the mixed monomials main loop. It introduces:
......
262 267
                    currentPolynomial = P(currentExpression)
263 268
                    pMonomials = currentPolynomial.monomials()
264 269
                    pCoefficients = currentPolynomial.coefficients()
265
                    spo_add_polynomial_coeffs_to_matrix(pMonomials, 
266
                                                        pCoefficients, 
267
                                                        knownMonomials, 
268
                                                        protoMatrixRows, 
269
                                                        columnsWidth)
270
                    spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
271
                                                            pCoefficients, 
272
                                                            knownMonomials, 
273
                                                            protoMatrixRows, 
274
                                                            columnsWidth)
270 275
                    #print "+++++"
271 276
                    # At iShift == 0, the following innerTpower loop adds  
272 277
                    # duplicate monomials, since no extra i^l * t^k is needed 
......
293 298
                            currentPolynomial = P(currentExpression)
294 299
                            pMonomials = currentPolynomial.monomials()
295 300
                            pCoefficients = currentPolynomial.coefficients()
296
                            spo_add_polynomial_coeffs_to_matrix(pMonomials, 
301
                            spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
297 302
                                                                pCoefficients, 
298 303
                                                                knownMonomials, 
299 304
                                                                protoMatrixRows, 
......
319 324
                    currentPolynomial = P(currentExpression) * polynomialAtPower
320 325
                    pMonomials = currentPolynomial.monomials()
321 326
                    pCoefficients = currentPolynomial.coefficients()
322
                    spo_add_polynomial_coeffs_to_matrix(pMonomials, 
323
                                                        pCoefficients, 
324
                                                        knownMonomials, 
325
                                                        protoMatrixRows, 
326
                                                        columnsWidth)
327
                    spo_add_polynomial_coeffs_to_matrix_row(pMonomials, 
328
                                                            pCoefficients, 
329
                                                            knownMonomials, 
330
                                                            protoMatrixRows, 
331
                                                            columnsWidth)
327 332
                # End for outerTpower 
328 333
                #print "++++++++++"
329 334
            # End for iShift
......
331 336
        nAtPower /= N
332 337
    # End for pPower loop
333 338
    return protoMatrixRows
334
# End spo_polynomial_to_matrix
339
# End spo_polynomial_to_proto_matrix
335 340

  
341
def spo_proto_to_column_matrix(protoMatrixRows):
342
    """
343
    Create a row (each column holds the coefficients of one polynomial) matrix.
344
    protoMatrixRows.
345
    
346
    Parameters
347
    ----------
348
    protoMatrixRows: a list of coefficient lists.
349
    """
350
    numRows = len(protoMatrixRows)
351
    if numRows == 0:
352
        return None
353
    numColumns = len(protoMatrixRows[numRows-1])
354
    if numColumns == 0:
355
        return None
356
    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]
362
    return baseMatrix
363
# End spo_proto_to_column_matrix.
364
#
365
def spo_proto_to_row_matrix(protoMatrixRows):
366
    """
367
    Create a row (each row holds the coefficients of one polynomial) matrix.
368
    protoMatrixRows.
369
    
370
    Parameters
371
    ----------
372
    protoMatrixRows: a list of coefficient lists.
373
    """
374
    numRows = len(protoMatrixRows)
375
    if numRows == 0:
376
        return None
377
    numColumns = len(protoMatrixRows[numRows-1])
378
    if numColumns == 0:
379
        return None
380
    baseMatrix = matrix(ZZ, numRows, numColumns)
381
    for rowIndex in xrange(0, numRows):
382
        if monomialLengthChars != 0:
383
            print protoMatrixRows[rowIndex]
384
        for colIndex in xrange(0, len(protoMatrixRows[rowIndex])):
385
            baseMatrix[rowIndex, colIndex] = protoMatrixRows[rowIndex][colIndex]
386
    return baseMatrix
387
# End spo_proto_to_row_matrix.
388
#
336 389
print "sagePolynomialOperations loaded..."
pobysoPythonSage/src/sageSLZ/sageMatrixOperations.sage (revision 83)
45 45
    return True
46 46
# End smo_is_lower_triangular_matrix
47 47

  
48
def smo_is_upper_triangular_matrix(mat):
49
    """
50
    Check that the matrix is upper triangular.
51
    """
52
    dimensions = mat.dimensions()
53
    # Must be a bidimensional matrix.
54
    if len(dimensions) != 2:
55
        return False
56
    # Must be square.
57
    if dimensions[0] != dimensions[1]:
58
        return False
59
    # A 1x1 matrix is lower triangular.
60
    if dimensions[0] == 1:
61
        return True
62
    for rowIndex in xrange(1, dimensions[0]):
63
        for colIndex in xrange(0, rowIndex):
64
            if mat[rowIndex, colIndex] != 0:
65
                print mat.rows()[rowIndex]
66
                return False
67
    return True
68
# End smo_is_upper_triangular_matrix
69

  
70
print "sageMatrixOperations loaded..."
pobysoPythonSage/src/sageSLZ/sageSLZ.sage (revision 83)
264 264
                    1/scalingCoeff * expVar + 3))
265 265

  
266 266
   
267
def slz_polynomial_and_interval_to_sage(polyRangeCenterErrorSo):
267
def slz_interval_and_polynomial_to_sage(polyRangeCenterErrorSo):
268 268
    """
269 269
    Compute the Sage version of the Taylor polynomial and it's
270 270
    companion data (interval, center...)
......
289 289
    errorSa = \
290 290
            pobyso_get_constant_as_rn_with_rf_so_sa(polyRangeCenterErrorSo[4])
291 291
    return((polynomialSa, polynomialChangedVarSa, intervalSa, centerSa, errorSa))
292
    # End slz_polynomial_and_interval_to_sage
292
    # End slz_interval_and_polynomial_to_sage
293 293

  
294 294
def slz_rat_poly_of_int_to_poly_for_coppersmith(ratPolyOfInt, 
295 295
                                                precision,
pobysoPythonSage/src/pobyso.py (revision 83)
115 115
    #print "rnDummy: ", rnDummy
116 116
    # Compare the local Sage RealNumber with rnArg.
117 117
    return(cmp_rn_value(rnArg, rnLocal))
118
# End pobyso_smp
118 119

  
119 120
def pobyso_change_var_in_function_so_so(funcSo, chvarExpSo):
121
    """
122
    Variable change in a function.
123
    """
120 124
    return(sollya_lib_evaluate(funcSo,chvarExpSo))
121
    
125
# End pobyso_change_var_in_function_so_so     
122 126

  
123 127
def pobyso_chebyshevform_so_so(functionSo, degreeSo, intervalSo):
124 128
    resultSo = sollya_lib_chebyshevform(functionSo, degreeSo, intervalSo)
125 129
    return(resultSo)
126
        
130
# End pobyso_chebyshevform_so_so.
127 131

  
128

  
129 132
def pobyso_compute_pos_function_abs_val_bounds_sa_sa(funcSa, lowerBoundSa, \
130 133
                                                     upperBoundSa):
131 134
    """
......
134 137
    funcSo = pobyso_parse_string(funcSa._assume_str())
135 138
    rangeSo = pobyso_range_sa_so(lowerBoundSa, upperBoundSa)
136 139
    infnormSo = pobyso_infnorm_so_so(funcSo,rangeSo)
140
    # Sollya return the infnorm as an interval.
137 141
    fMaxSa = pobyso_get_interval_from_range_so_sa(infnormSo)
138 142
    # Get the top bound and compute the binade top limit.
139 143
    fMaxUpperBoundSa = fMaxSa.upper()
......
142 146
    funcAuxSo = pobyso_parse_string(str(binadeTopLimitSa) +  \
143 147
                                    '-(' + f._assume_str() + ')')
144 148
    pobyso_autoprint(funcAuxSo)
145
    # Clear the Sollay range before a new call to infnorm and issue the call.
149
    # Clear the Sollya range before a new call to infnorm and issue the call.
146 150
    sollya_lib_clear_obj(infnormSo)
147 151
    infnormSo = pobyso_infnorm_so_so(funcAuxSo,rangeSo)
148 152
    fMinSa = pobyso_get_interval_from_range_so_sa(infnormSo)
......
154 158
    # Create a RealIntervalField and create an interval with the "good" bounds.
155 159
    RRRI = RealIntervalField(maxPrecSa)
156 160
    imageIntervalSa = RRRI(fMinLowerBoundSa, fMaxUpperBoundSa)
157
    # Free the uneeded Sollya objects
161
    # Free the unneeded Sollya objects
158 162
    sollya_lib_clear_obj(funcSo)
159 163
    sollya_lib_clear_obj(funcAuxSo)
160 164
    sollya_lib_clear_obj(rangeSo)
161 165
    return(imageIntervalSa)
162
    # End pobyso_compute_function_abs_val_bounds_sa_sa
166
# End pobyso_compute_pos_function_abs_val_bounds_sa_sa
163 167

  
164 168
def pobyso_constant(rnArg):
165 169
    """ Legacy function. See pobyso_constant_sa_so. """
......
301 305
    return(sollya_lib_get_constant(get_rn_value(rnArg), soConst))
302 306
    
303 307
def pobyso_get_constant_as_rn(ctExpSo):
304
    """ Legacy function. See pobyso_get_constant_as_rn_so_sa. """ 
308
    """ 
309
    Legacy function. See pobyso_get_constant_as_rn_so_sa. 
310
    """ 
305 311
    return(pobyso_get_constant_as_rn_so_sa(ctExpSo))
306 312
    
307 313
def pobyso_get_constant_as_rn_so_sa(constExpSo):
314
    """
315
    Get a Sollya constant as a Sage "real number".
316
    The precision of the floating-point number returned is that of the Sollya
317
    constant.
318
    """
308 319
    precisionSa  = pobyso_get_prec_of_constant_so_sa(constExpSo) 
309 320
    RRRR = RealField(precisionSa)
310 321
    rnSa = RRRR(0)
311 322
    sollya_lib_get_constant(get_rn_value(rnSa), constExpSo)
312 323
    return(rnSa)
324
# End pobyso_get_constant_as_rn_so_sa
313 325

  
314 326
def pobyso_get_constant_as_rn_with_rf(ctExp, realField):
315
    """ Legacy function. See pobyso_get_constant_as_rn_with_rf_so_sa."""
327
    """ 
328
    Legacy function. See pobyso_get_constant_as_rn_with_rf_so_sa.
329
    """
316 330
    return(pobyso_get_constant_as_rn_with_rf_so_sa(ctExp, realField))
317 331
    
318 332
def pobyso_get_constant_as_rn_with_rf_so_sa(ctExpSo, realFieldSa = None):
333
    """
334
    Get a Sollya constant as a Sage "real number".
335
    If no real field is specified, the precision of the floating-point number 
336
    returned is that of the Solly constant.
337
    Otherwise is is that of the real field. Hence rounding may happen.
338
    """
319 339
    if realFieldSa is None:
320 340
        sollyaPrecSa = pobyso_get_prec_so_sa()
321 341
        realFieldSa = RealField(sollyaPrecSa)
322 342
    rnSa = realFieldSa(0)
323 343
    sollya_lib_get_constant(get_rn_value(rnSa), ctExpSo)
324 344
    return(rnSa)
345
# End pobyso_get_constant_as_rn_with_rf_so_sa
325 346

  
326 347
def pobyso_get_free_variable_name():
327
    """ Legacy function. See pobyso_get_free_variable_name_so_sa."""
348
    """ 
349
    Legacy function. See pobyso_get_free_variable_name_so_sa.
350
    """
328 351
    return(pobyso_get_free_variable_name_so_sa())
329 352

  
330 353
def pobyso_get_free_variable_name_so_sa():
331 354
    return(sollya_lib_get_free_variable_name())
332 355
    
333 356
def pobyso_get_function_arity(expressionSo):
334
    """ Legacy function. See pobyso_get_function_arity_so_sa."""
357
    """ 
358
    Legacy function. See pobyso_get_function_arity_so_sa.
359
    """
335 360
    return(pobyso_get_function_arity_so_sa(expressionSo))
336 361

  
337 362
def pobyso_get_function_arity_so_sa(expressionSo):
......
340 365
    return(int(arity.value))
341 366

  
342 367
def pobyso_get_head_function(expressionSo):
343
    """ Legacy function. See pobyso_get_head_function_so_sa. """
368
    """ 
369
    Legacy function. See pobyso_get_head_function_so_sa. 
370
    """
344 371
    return(pobyso_get_head_function_so_sa(expressionSo)) 
345 372

  
346 373
def pobyso_get_head_function_so_sa(expressionSo):
......
351 378
def pobyso_get_interval_from_range_so_sa(soRange, realIntervalFieldSa = None ):
352 379
    """
353 380
    Return the Sage interval corresponding to the Sollya range argument.
354
    If no reaInterval lField is passed as argument, the interval bounds are not
381
    If no reaIntervalField is passed as an argument, the interval bounds are not
355 382
    rounded: they are elements of RealIntervalField of the "right" precision
356 383
    to hold all the digits.
357 384
    """
......
456 483
    """
457 484
    #pobyso_autoprint(sollyaExp)
458 485
    operator = pobyso_get_head_function_so_sa(sollyaExp)
486
    sollyaLibFreeVariableName = sollya_lib_get_free_variable_name()
459 487
    # Constants and the free variable are special cases.
460 488
    # All other operator are dealt with in the same way.
461 489
    if (operator != SOLLYA_BASE_FUNC_CONSTANT) and \
......
487 515
        return pobyso_get_constant_as_rn_with_rf_so_sa(sollyaExp, realField)
488 516
    elif operator == SOLLYA_BASE_FUNC_FREE_VARIABLE:
489 517
        #print "This is free variable"
490
        return(eval(sollya_lib_get_free_variable_name()))
518
        return(eval(sollyaLibFreeVariableName))
491 519
    else:
492 520
        print "Unexpected"
493 521
        return eval('None')
494 522
# End pobyso_get_sage_poly_from_sollya_poly
495 523

  
496 524
def pobyso_get_poly_sa_so(polySo, realFieldSa=None):
525
    """
526
    Create a Sollya polynomial from a Sage polynomial.
527
    """
497 528
    pass
498 529
# pobyso_get_poly_sa_so
499 530

  
......
537 568
    Get the subfunctions of an expression.
538 569
    Return the number of subfunctions and the list of subfunctions addresses.
539 570
    S.T.: Could not figure out another way than that ugly list of declarations
540
    to recover the addresses of the subfunctions. 
571
    to recover the addresses of the subfunctions.
572
    We limit ourselves to arity 8 functions. 
541 573
    """
542 574
    subf0 = c_int(0)
543 575
    subf1 = c_int(0)
......
551 583
    arity = c_int(0)
552 584
    nullPtr = POINTER(c_int)()
553 585
    sollya_lib_get_subfunctions(expressionSo, byref(arity), \
554
    byref(subf0), byref(subf1), byref(subf2), byref(subf3), byref(subf4), byref(subf5),\
555
     byref(subf6), byref(subf7), byref(subf8), nullPtr, None) 
556
#    byref(cast(subfunctions[0], POINTER(c_int))), byref(cast(subfunctions[0], POINTER(c_int))), \
557
#    byref(cast(subfunctions[2], POINTER(c_int))), byref(cast(subfunctions[3], POINTER(c_int))), \
558
#    byref(cast(subfunctions[4], POINTER(c_int))), byref(cast(subfunctions[5], POINTER(c_int))), \
559
#    byref(cast(subfunctions[6], POINTER(c_int))), byref(cast(subfunctions[7], POINTER(c_int))), \
586
      byref(subf0), byref(subf1), byref(subf2), byref(subf3), \
587
      byref(subf4), byref(subf5),\
588
      byref(subf6), byref(subf7), byref(subf8), nullPtr, None) 
589
#    byref(cast(subfunctions[0], POINTER(c_int))), \
590
#    byref(cast(subfunctions[0], POINTER(c_int))), \
591
#    byref(cast(subfunctions[2], POINTER(c_int))), \
592
#    byref(cast(subfunctions[3], POINTER(c_int))), \
593
#    byref(cast(subfunctions[4], POINTER(c_int))), \
594
#    byref(cast(subfunctions[5], POINTER(c_int))), \
595
#    byref(cast(subfunctions[6], POINTER(c_int))), \
596
#    byref(cast(subfunctions[7], POINTER(c_int))), \
560 597
#    byref(cast(subfunctions[8], POINTER(c_int))), nullPtr)
561
    subfunctions = [subf0, subf1, subf2, subf3, subf4, subf5, subf6, subf7, subf8]
598
    subfunctions = [subf0, subf1, subf2, subf3, subf4, subf5, subf6, subf7, \
599
                    subf8]
562 600
    subs = []
563 601
    if arity.value > pobyso_max_arity:
564 602
        return(0,[])
......
581 619
    sollya_lib_get_constant_as_int(byref(precSa), precSo)
582 620
    sollya_lib_clear_obj(precSo)
583 621
    return(int(precSa.value))
622
# End pobyso_get_prec_so_sa.
584 623

  
585 624
def pobyso_get_prec_of_constant(ctExpSo):
586 625
    """ Legacy function. See pobyso_get_prec_of_constant_so_sa. """
......
612 651
    pobyso_name_free_variable_sa_so(freeVariableName)
613 652

  
614 653
def pobyso_name_free_variable_sa_so(freeVariableName):
654
    """
655
    Set the free variable name in Sollya from a Sage string.
656
    """
615 657
    sollya_lib_name_free_variable(freeVariableName)
616 658

  
617 659
def pobyso_parse_string(string):
......
619 661
    return(pobyso_parse_string_sa_so(string))
620 662
 
621 663
def pobyso_parse_string_sa_so(string):
664
    """
665
    Get the Sollya expression computed from a Sage string.
666
    """
622 667
    return(sollya_lib_parse_string(string))
623 668

  
624 669
def pobyso_range(rnLowerBound, rnUpperBound):
......
627 672

  
628 673
def pobyso_bounds_to_range_sa_so(rnLowerBoundSa, rnUpperBoundSa):
629 674
    """
630
    Return a Sollya range from to 2 RealField elements.
675
    Return a Sollya range from to 2 RealField Sage elements.
631 676
    The Sollya range element has a sufficient precision to hold all
632
    the digits of the bounds.
677
    the digits of the Sage bounds.
633 678
    """
679
    # Sanity check.
634 680
    if rnLowerBoundSa > rnUpperBoundSa:
635 681
        return None
682
    # Check for the largest precision.
636 683
    lbPrec = rnLowerBoundSa.parent().precision()
637 684
    ubPrec = rnLowerBoundSa.parent().precision()
638 685
    currentSollyaPrecSa = pobyso_get_prec_so_sa()
......
645 692
    lowerBoundSo = sollya_lib_constant(get_rn_value(rnLowerBoundSa))
646 693
    upperBoundSo = sollya_lib_constant(get_rn_value(rnUpperBoundSa))
647 694
    rangeSo = sollya_lib_range(lowerBoundSo, upperBoundSo)
648
    currentPrecSo = sollya_lib_get_prec(None)
649 695
    if maxPrecSa > currentSollyaPrecSa:
650 696
        sollya_lib_set_prec(currentPrecSo)
651 697
        sollya_lib_clear_obj(currentPrecSo)
......
655 701
    return(rangeSo)
656 702

  
657 703
def pobyso_range_to_interval_so_sa(rangeSo, realIntervalField = None):
704
    """
705
    Get a Sage interval from a Sollya range.
706
    If no realIntervalField is given as a parameter, the Sage interval
707
    precision is that of the Sollya range.
708
    Otherwise, the precision is that of the realIntervalField. Rounding
709
    may happen.
710
    """
658 711
    if realIntervalField is None:
659 712
        precSa = pobyso_get_prec_of_range_so_sa(rangeSo)
660 713
        realIntervalField = RealIntervalField(precSa)
......
672 725
    All arguments are Sage/Python.
673 726
    The functions (func and weight) must be passed as expressions or strings.
674 727
    Otherwise the function fails. 
675
    The return value is a pointer is a Sage polynomial.
728
    The return value is a Sage polynomial.
676 729
    """
677
    var('zorglub')    # Dummy variable name for type check only.
730
    var('zorglub')    # Dummy variable name for type check only. Type of 
731
    # zorglub is "symbolic expression".
678 732
    polySo = pobyso_remez_canonical_sa_so(func, \
679 733
                                 degree, \
680 734
                                 lowerBound, \
681 735
                                 upperBound, \
682 736
                                 weight = None, \
683 737
                                 quality = None)
738
    # String test
684 739
    if parent(func) == parent("string"):
685 740
        functionSa = eval(func)
686 741
    # Expression test.
687 742
    elif type(func) == type(zorglub):
688 743
        functionSa = func
744
    else:
745
        return None
746
    #
689 747
    maxPrecision = 0
690 748
    if polySo is None:
691 749
        return(None)
......
694 752
    polynomialRing = RRRR[functionSa.variables()[0]]
695 753
    expSa = pobyso_get_sage_exp_from_sollya_exp_so_sa(polySo, RRRR)
696 754
    polySa = polynomial(expSa, polynomialRing)
755
    sollya_lib_clear_obj(polySo)
697 756
    return(polySa)
698 757
    
699 758
def pobyso_remez_canonical(func, \
......
721 780
    Otherwise the function fails. 
722 781
    The return value is a pointer to a Sollya function.
723 782
    """
724
    var('zorglub')    # Dummy variable name for type check only.
783
    var('zorglub')    # Dummy variable name for type check only. Type of
784
    # zorglub is "symbolic expression".
725 785
    currentVariableName = None
726 786
    # The func argument can be of different types (string, 
727 787
    # symbolic expression...)
......
750 810
        qualitySo= pobyso_constant_sa_so(quality)
751 811
    else:
752 812
        qualitySo = None
753
    return(sollya_lib_remez(functionSo, \
754
                            degreeSo, \
755
                            rangeSo, \
756
                            weightSo, \
757
                            qualitySo, \
758
                            None))
759
    
813
        
814
    remezPolySo = sollya_lib_remez(functionSo, \
815
                                   degreeSo, \
816
                                   rangeSo, \
817
                                   weightSo, \
818
                                   qualitySo, \
819
                                   None)
820
    sollya_lib_clear_obj(functionSo)
821
    sollya_lib_clear_obj(degreeSo)
822
    sollya_lib_clear_obj(rangeSo)
823
    sollya_lib_clear_obj(weightSo)
824
    if not qualitySo is None:
825
        sollya_lib_clear_obj(qualtiySo)
826
    return(remezPolySo)
827
# End pobyso_remez_canonical_sa_so
828

  
760 829
def pobyso_remez_canonical_so_so(funcSo, \
761 830
                                 degreeSo, \
762 831
                                 rangeSo, \
......
817 886
    # If changed, reset the Sollya working precision.
818 887
    if not sollyaPrecSo is None:
819 888
        sollya_lib_set_prec(initialPrecSo)
820
        sollya_lib_clear_obj(initailPrecSo)
889
        sollya_lib_clear_obj(initialPrecSo)
821 890
    return((polyVarChangedSo, intervalCenterSo, maxErrorSo))
822 891
# end pobyso_taylor_expansion_with_change_var_so_so
823 892

  
......
870 939
    for 'interval' with 'errorType'. 
871 940
    point: must be a Real or a Real interval.
872 941
    return the Taylor form as an array
873
    TODO: take care of the interval and of point when it is an interval;
942
    TODO: take care of the interval and of the point when it is an interval;
874 943
          when errorType is not None;
875
          take care of the other elements of the Taylor form (coefficients errors and
876
          delta.
944
          take care of the other elements of the Taylor form (coefficients 
945
          errors and delta.
877 946
    """
878 947
    # Absolute as the default error.
879 948
    if errorType is None:
......
902 971
        # TODO: deal with the interval case.
903 972
        pass
904 973
    # Call Sollya
905
    taylorFormSo = sollya_lib_taylorform(functionSo, degreeSo, pointSo, errorTypeSo,\
974
    taylorFormSo = \
975
        sollya_lib_taylorform(functionSo, degreeSo, pointSo, errorTypeSo,\
906 976
                                         None)
907 977
    (tfsAsList, numElements, isEndElliptic) = \
908 978
            pobyso_get_list_elements_so_so(taylorFormSo)

Formats disponibles : Unified diff