Révision 155
pobysoPythonSage/src/pobyso.py (revision 155) | ||
---|---|---|
282 | 282 |
return(constSa.value) |
283 | 283 |
# End pobyso_constant_from_int_so_sa |
284 | 284 |
|
285 |
def pobyso_error_so(): |
|
286 |
return sollya_lib_error(None) |
|
287 |
# End pobyso_error(). |
|
288 |
|
|
285 | 289 |
def pobyso_function_type_as_string(funcType): |
286 | 290 |
""" Legacy function. See pobyso_function_type_as_string_so_sa. """ |
287 | 291 |
return(pobyso_function_type_as_string_so_sa(funcType)) |
... | ... | |
761 | 765 |
return(int(prec.value)) |
762 | 766 |
# End pobyso_get_prec_of_range_so_sa() |
763 | 767 |
|
764 |
def pobyso_guess_degree_sa_sa(functionSa, intervalSa, errorSa, weightSa=None, \ |
|
765 |
degreeBoundSa=None): |
|
768 |
def pobyso_guess_degree_sa_sa(functionSa, intervalSa, approxErrorSa, |
|
769 |
weightSa=None, degreeBoundSa=None): |
|
770 |
""" |
|
771 |
Sa_sa variant of the solly_guessdegree function. |
|
772 |
Return 0 if something goes wrong. |
|
773 |
""" |
|
766 | 774 |
functionAsStringSa = functionSa._assume_str() |
767 | 775 |
functionSo = pobyso_parse_string_sa_so(functionAsStringSa) |
776 |
if pobyso_is_error_so_sa(functionSo): |
|
777 |
sollya_lib_clear_obj(functionSo) |
|
778 |
return 0 |
|
768 | 779 |
rangeSo = pobyso_interval_to_range_sa_so(intervalSa) |
769 |
errorSo = pobyso_constant_sa_so(errorSa) |
|
780 |
# The approximation error is expected to be a floating point number. |
|
781 |
if pobyso_is_floating_point_number_sa_sa(approxErrorSa): |
|
782 |
approxErrorSo = pobyso_constant_sa_so(approxErrorSa) |
|
783 |
else: |
|
784 |
approxErrorSo = pobyso_constant_sa_so(RR(approxErrorSa)) |
|
770 | 785 |
if not weightSa is None: |
771 | 786 |
weightAsStringSa = weightSa._assume_str() |
772 | 787 |
weightSo = pobyso_parse_string_sa_so(weightAsStringSa) |
788 |
if pobyso_is_error(weightSo): |
|
789 |
sollya_lib_clear_obj(functionSo) |
|
790 |
sollya_lib_clear_obj(rangeSo) |
|
791 |
sollya_lib_clear_obj(approxErrorSo) |
|
792 |
sollya_lib_clear_obj(weightSo) |
|
793 |
return 0 |
|
773 | 794 |
else: |
774 | 795 |
weightSo = None |
775 | 796 |
if not degreeBoundSa is None: |
... | ... | |
778 | 799 |
degreeBoundSo = None |
779 | 800 |
guessedDegreeSa = pobyso_guess_degree_so_sa(functionSo, |
780 | 801 |
rangeSo, |
781 |
errorSo,
|
|
802 |
approxErrorSo,
|
|
782 | 803 |
weightSo, |
783 | 804 |
degreeBoundSo) |
784 | 805 |
sollya_lib_clear_obj(functionSo) |
785 | 806 |
sollya_lib_clear_obj(rangeSo) |
786 |
sollya_lib_clear_obj(errorSo)
|
|
807 |
sollya_lib_clear_obj(approxErrorSo)
|
|
787 | 808 |
if not weightSo is None: |
788 | 809 |
sollya_lib_clear_obj(weightSo) |
789 | 810 |
if not degreeBoundSo is None: |
... | ... | |
851 | 872 |
return(intervalSo) |
852 | 873 |
# End pobyso_interval_to_range_sa_so |
853 | 874 |
|
875 |
def pobyso_is_error_so_sa(objSo): |
|
876 |
""" |
|
877 |
Thin wrapper around the sollya_lib_obj_is_error() function. |
|
878 |
""" |
|
879 |
if sollya_lib_obj_is_error(objSo) != 0: |
|
880 |
return True |
|
881 |
else: |
|
882 |
return False |
|
883 |
# End pobyso_is_error-so_sa |
|
884 |
|
|
885 |
def pobyso_is_floating_point_number_sa_sa(numberSa): |
|
886 |
""" |
|
887 |
Check whether a Sage number is floating point |
|
888 |
""" |
|
889 |
return numberSa.parent().__class__ is RR.__class__ |
|
890 |
|
|
854 | 891 |
def pobyso_lib_init(): |
855 | 892 |
sollya_lib_init(None) |
856 | 893 |
|
... | ... | |
873 | 910 |
|
874 | 911 |
def pobyso_parse_string_sa_so(string): |
875 | 912 |
""" |
876 |
Get the Sollya expression computed from a Sage string. |
|
913 |
Get the Sollya expression computed from a Sage string or |
|
914 |
a Sollya error object if parsing failed. |
|
877 | 915 |
""" |
878 | 916 |
return(sollya_lib_parse_string(string)) |
879 | 917 |
|
pobysoPythonSage/src/sollya_lib.sage (revision 155) | ||
---|---|---|
32 | 32 |
sollya.sollya_lib_constant_from_uint64 |
33 | 33 |
sollya_lib_copy_obj = sollya.sollya_lib_copy_obj |
34 | 34 |
sollya_lib_cos = sollya.sollya_lib_cos |
35 |
sollya_lib_error=sollya.sollya_lib_error |
|
35 | 36 |
sollya_lib_evaluate = sollya.sollya_lib_evaluate |
36 | 37 |
sollya_lib_free = sollya.sollya_lib_free |
37 | 38 |
sollya_lib_get_canonical = sollya.sollya_lib_get_canonical |
pobysoPythonSage/src/sageSLZ/sagePolynomialOperations.sage (revision 155) | ||
---|---|---|
55 | 55 |
" " + str(knownMonomials[knownMonomialIndex]) |
56 | 56 |
print monomialAsString, " " * \ |
57 | 57 |
(columnsWidth - len(monomialAsString)), |
58 |
# Add the coefficient to the proto matrix row and delete the \
|
|
58 |
# Add the coefficient to the proto matrix row and delete the |
|
59 | 59 |
# known monomial from the current pMonomial list |
60 | 60 |
#(and the corresponding coefficient as well). |
61 | 61 |
protoMatrixRowCoefficients.append(pCoefficients[indexInPmonomials]) |
... | ... | |
839 | 839 |
return polynomialsList |
840 | 840 |
# End spo_polynomial_to_proto_matrix_5 |
841 | 841 |
|
842 |
def spo_polynomial_to_polynomials_list_6(p, alpha, N, iBound, tBound, |
|
843 |
columnsWidth=0): |
|
844 |
""" |
|
845 |
From p, alpha, N build a list of polynomials use to create a base |
|
846 |
that will eventually be reduced with LLL. |
|
847 |
|
|
848 |
The bounds are computed for the coefficients that will be used to |
|
849 |
form the base. |
|
850 |
|
|
851 |
We try to introduce only one new monomial at a time, whithout trying to |
|
852 |
obtain a triangular matrix. |
|
853 |
|
|
854 |
There are many possibilities to introduce the monomials: our goal is also |
|
855 |
to introduce each of them on the diagonal with the smallest coefficient. |
|
856 |
|
|
857 |
The method depends on the structure of the polynomial. Here it is adapted |
|
858 |
to the a_n*i^n + ... + a_1 * i - t + b form. |
|
859 |
|
|
860 |
Parameters |
|
861 |
---------- |
|
862 |
p: the (bivariate) polynomial; |
|
863 |
alpha: |
|
864 |
N: |
|
865 |
iBound: |
|
866 |
tBound: |
|
867 |
columsWidth: if == 0, no information is displayed, otherwise data is |
|
868 |
printed in colums of columnsWitdth width. |
|
869 |
""" |
|
870 |
pRing = p.parent() |
|
871 |
polynomialsList = [] |
|
872 |
pVariables = p.variables() |
|
873 |
iVariable = pVariables[0] |
|
874 |
tVariable = pVariables[1] |
|
875 |
polynomialAtPower = copy(p) |
|
876 |
currentPolynomial = pRing(1) # Constant term. |
|
877 |
pIdegree = p.degree(iVariable) |
|
878 |
pTdegree = p.degree(tVariable) |
|
879 |
maxIdegree = pIdegree * alpha |
|
880 |
currentIdegree = currentPolynomial.degree(iVariable) |
|
881 |
nAtAlpha = N^alpha |
|
882 |
nAtPower = nAtAlpha |
|
883 |
polExpStr = "" |
|
884 |
# |
|
885 |
## Shouldn't we start at tPower == 1 because polynomials without |
|
886 |
# t monomials are useless? |
|
887 |
for tPower in xrange(0, alpha+1): |
|
888 |
## Start at iPower == 0 because here there are i monomials |
|
889 |
# in p even if iPower is zero. |
|
890 |
for iPower in xrange(0, alpha-tPower+1): |
|
891 |
if iPower + tPower <= alpha: |
|
892 |
print "iPower:", iPower, " tPower:", tPower |
|
893 |
q = pRing(iVariable * iBound)^iPower * ((p * N)^tPower) |
|
894 |
print q.monomials() |
|
895 |
polynomialsList.append(q) |
|
896 |
return polynomialsList |
|
897 |
|
|
898 |
""" |
|
899 |
# We first introduce all the monomials in i alone multiplied by N^alpha. |
|
900 |
for iPower in xrange(0, maxIdegree + 1): |
|
901 |
if columnsWidth !=0: |
|
902 |
polExpStr = spo_expression_as_string(iPower, iBound, |
|
903 |
0, tBound, |
|
904 |
0, alpha) |
|
905 |
print "->", polExpStr |
|
906 |
currentExpression = iVariable^iPower * nAtAlpha * iBound^iPower |
|
907 |
currentPolynomial = pRing(currentExpression) |
|
908 |
polynomialsList.append(currentPolynomial) |
|
909 |
# End for iPower |
|
910 |
# We work from p^1 * N^alpha-1 to p^alpha * N^0 |
|
911 |
for pPower in xrange(1, alpha + 1): |
|
912 |
# First of all the p^pPower * N^(alpha-pPower) polynomial. |
|
913 |
nAtPower /= N |
|
914 |
if columnsWidth !=0: |
|
915 |
polExpStr = spo_expression_as_string(0, iBound, |
|
916 |
0, tBound, |
|
917 |
pPower, alpha-pPower) |
|
918 |
print "->", polExpStr |
|
919 |
currentPolynomial = polynomialAtPower * nAtPower |
|
920 |
polynomialsList.append(currentPolynomial) |
|
921 |
# Exit when pPower == alpha |
|
922 |
if pPower == alpha: |
|
923 |
return polynomialsList |
|
924 |
for iPower in xrange(1, pIdegree + 1): |
|
925 |
iCurrentPower = pIdegree + iPower |
|
926 |
for tPower in xrange(pPower-1, 0, -1): |
|
927 |
#print "tPower:", tPower |
|
928 |
if columnsWidth != 0: |
|
929 |
polExpStr = spo_expression_as_string(iCurrentPower, iBound, |
|
930 |
tPower, tBound, |
|
931 |
0, alpha) |
|
932 |
print "->", polExpStr |
|
933 |
currentExpression = i^iCurrentPower * iBound^iCurrentPower * t^tPower * tBound^tPower *nAtAlpha |
|
934 |
currentPolynomial = pRing(currentExpression) |
|
935 |
polynomialsList.append(currentPolynomial) |
|
936 |
iCurrentPower += pIdegree |
|
937 |
# End for tPower |
|
938 |
# We now introduce the mixed i^k * t^l monomials by i^m * p^n * N^(alpha-n) |
|
939 |
if columnsWidth != 0: |
|
940 |
polExpStr = spo_expression_as_string(iPower, iBound, |
|
941 |
0, tBound, |
|
942 |
pPower, alpha-pPower) |
|
943 |
print "->", polExpStr |
|
944 |
currentExpression = i^iPower * iBound^iPower * nAtPower |
|
945 |
currentPolynomial = pRing(currentExpression) * polynomialAtPower |
|
946 |
polynomialsList.append(currentPolynomial) |
|
947 |
# End for iPower |
|
948 |
polynomialAtPower *= p |
|
949 |
# End for pPower loop |
|
950 |
""" |
|
951 |
return polynomialsList |
|
952 |
# End spo_polynomial_to_proto_matrix_6 |
|
953 |
|
|
842 | 954 |
def spo_proto_to_column_matrix(protoMatrixColumns): |
843 | 955 |
""" |
844 | 956 |
Create a column (each row holds the coefficients for one monomial) matrix. |
pobysoPythonSage/src/testPobyso.sage (revision 155) | ||
---|---|---|
93 | 93 |
return timing |
94 | 94 |
# End test_pobyso_bounds_to_range_sa_so |
95 | 95 |
|
96 |
def test_pobyso_error_so(repeat=1000, number=10): |
|
97 |
functionName = inspect.stack()[0][3] |
|
98 |
print "Running", inspect.stack()[0][3], "..." |
|
99 |
# |
|
100 |
def test(): |
|
101 |
errorSo = pobyso_error_so() |
|
102 |
sollya_lib_clear_obj(errorSo) |
|
103 |
# |
|
104 |
wrapped = test_pobyso_wrapper(test) |
|
105 |
timing = min(timeit.repeat(wrapped, repeat=repeat, number=number)) |
|
106 |
print "\t...", functionName, "done." |
|
107 |
return timing |
|
108 |
# End test_pobyso_error_so |
|
109 |
|
|
96 | 110 |
def test_pobyso_get_list_elements_so_so(repeat = 1000, number=10): |
97 | 111 |
functionName = inspect.stack()[0][3] |
98 | 112 |
print "Running", functionName, "..." |
... | ... | |
176 | 190 |
intervalSo, |
177 | 191 |
errorSo, |
178 | 192 |
weightSo, |
179 |
degreeBoundSo) |
|
193 |
degreeBoundSo) |
|
194 |
""" |
|
195 |
pobyso_guess_degree_so_sa(funcExpSo, |
|
196 |
intervalSo, |
|
197 |
errorSo, |
|
198 |
None, |
|
199 |
None) |
|
200 |
""" |
|
180 | 201 |
wrapped = test_pobyso_wrapper(test) |
181 | 202 |
timing = min(timeit.repeat(wrapped, repeat=repeat, number=number)) |
182 | 203 |
print "\t...", functionName, "done." |
... | ... | |
188 | 209 |
return timing |
189 | 210 |
# End test_pobyso_guess_degree_so_sa |
190 | 211 |
|
212 |
def test_pobyso_is_error_so_sa(repeat=1000, number=10): |
|
213 |
functionName = inspect.stack()[0][3] |
|
214 |
print "Running", inspect.stack()[0][3], "..." |
|
215 |
# |
|
216 |
def test(): |
|
217 |
errorSo = pobyso_error_so() |
|
218 |
if not pobyso_is_error_so_sa(errorSo): |
|
219 |
print "Error!" |
|
220 |
sollya_lib_clear_obj(errorSo) |
|
221 |
# |
|
222 |
wrapped = test_pobyso_wrapper(test) |
|
223 |
timing = min(timeit.repeat(wrapped, repeat=repeat, number=number)) |
|
224 |
print "\t...", functionName, "done." |
|
225 |
return timing |
|
226 |
# End test_pobyso_error_so |
|
227 |
|
|
191 | 228 |
def test_pobyso_lib_init(iterationsNum=10000): |
192 | 229 |
""" |
193 | 230 |
Must be called exactly once. Leaks lots of memory otherwise. |
Formats disponibles : Unified diff