Statistiques
| Révision :

root / pobysoPythonSage / src / sageSLZ / sageRunSLZ.sage @ 197

Historique | Voir | Annoter | Télécharger (41,84 ko)

1 194 storres
"""
2 194 storres
SLZ runtime function.
3 194 storres
"""
4 194 storres
5 194 storres
def srs_run_SLZ_v01(inputFunction,
6 194 storres
                    inputLowerBound,
7 194 storres
                    inputUpperBound,
8 194 storres
                    alpha,
9 194 storres
                    degree,
10 194 storres
                    precision,
11 194 storres
                    emin,
12 194 storres
                    emax,
13 194 storres
                    targetHardnessToRound,
14 194 storres
                    debug = False):
15 194 storres
16 194 storres
    if debug:
17 194 storres
        print "Function                :", inputFunction
18 194 storres
        print "Lower bound             :", inputLowerBound
19 194 storres
        print "Upper bounds            :", inputUpperBound
20 194 storres
        print "Alpha                   :", alpha
21 194 storres
        print "Degree                  :", degree
22 194 storres
        print "Precision               :", precision
23 194 storres
        print "Emin                    :", emin
24 194 storres
        print "Emax                    :", emax
25 194 storres
        print "Target hardness-to-round:", targetHardnessToRound
26 194 storres
        print
27 194 storres
    ## Important constants.
28 194 storres
    ### Stretch the interval if no error happens.
29 194 storres
    noErrorIntervalStretch = 1 + 2^(-5)
30 194 storres
    ### If no vector validates the Coppersmith condition, shrink the interval
31 194 storres
    #   by the following factor.
32 194 storres
    noCoppersmithIntervalShrink = 1/2
33 194 storres
    ### If only (or at least) one vector validates the Coppersmith condition,
34 194 storres
    #   shrink the interval by the following factor.
35 194 storres
    oneCoppersmithIntervalShrink = 3/4
36 194 storres
    #### If only null resultants are found, shrink the interval by the
37 194 storres
    #    following factor.
38 194 storres
    onlyNullResultantsShrink     = 3/4
39 194 storres
    ## Structures.
40 194 storres
    RRR         = RealField(precision)
41 194 storres
    RRIF        = RealIntervalField(precision)
42 194 storres
    ## Converting input bound into the "right" field.
43 194 storres
    lowerBound = RRR(inputLowerBound)
44 194 storres
    upperBound = RRR(inputUpperBound)
45 194 storres
    ## Before going any further, check domain and image binade conditions.
46 194 storres
    print inputFunction(1).n()
47 194 storres
    (lb,ub) = slz_fix_bounds_for_binades(lowerBound, upperBound, inputFunction)
48 194 storres
    if lb != lowerBound or ub != upperBound:
49 194 storres
        print "lb:", lb, " - ub:", ub
50 194 storres
        print "Invalid domain/image binades. Domain:",\
51 194 storres
        lowerBound, upperBound, "Images:", \
52 194 storres
        inputFunction(lowerBound), inputFunction(upperBound)
53 194 storres
        raise Exception("Invalid domain/image binades.")
54 194 storres
    #
55 194 storres
    ## Progam initialization
56 194 storres
    ### Approximation polynomial accuracy and hardness to round.
57 194 storres
    polyApproxAccur           = 2^(-(targetHardnessToRound + 1))
58 194 storres
    polyTargetHardnessToRound = targetHardnessToRound + 1
59 194 storres
    ### Significand to integer conversion ratio.
60 194 storres
    toIntegerFactor           = 2^(precision-1)
61 194 storres
    print "Polynomial approximation required accuracy:", polyApproxAccur.n()
62 194 storres
    ### Variables and rings for polynomials and root searching.
63 194 storres
    i=var('i')
64 194 storres
    t=var('t')
65 194 storres
    inputFunctionVariable = inputFunction.variables()[0]
66 194 storres
    function = inputFunction.subs({inputFunctionVariable:i})
67 194 storres
    #  Polynomial Rings over the integers, for root finding.
68 194 storres
    Zi = ZZ[i]
69 194 storres
    Zt = ZZ[t]
70 194 storres
    Zit = ZZ[i,t]
71 194 storres
    ## Number of iterations limit.
72 194 storres
    maxIter = 100000
73 194 storres
    #
74 194 storres
    ## Compute the scaled function and the degree, in their Sollya version
75 194 storres
    #  once for all.
76 194 storres
    (scaledf, sdlb, sdub, silb, siub) = \
77 194 storres
        slz_compute_scaled_function(function, lowerBound, upperBound, precision)
78 194 storres
    print "Scaled function:", scaledf._assume_str().replace('_SAGE_VAR_', '')
79 194 storres
    scaledfSo = sollya_lib_parse_string(scaledf._assume_str().replace('_SAGE_VAR_', ''))
80 194 storres
    degreeSo  = pobyso_constant_from_int_sa_so(degree)
81 194 storres
    #
82 194 storres
    ## Compute the scaling. boundsIntervalRifSa defined out of the loops.
83 194 storres
    domainBoundsInterval   = RRIF(lowerBound, upperBound)
84 194 storres
    (unscalingFunction, scalingFunction) = \
85 194 storres
        slz_interval_scaling_expression(domainBoundsInterval, i)
86 194 storres
    #print scalingFunction, unscalingFunction
87 194 storres
    ## Set the Sollya internal precision (with an arbitrary minimum of 192).
88 194 storres
    internalSollyaPrec = ceil((RR('1.5') * targetHardnessToRound) / 64) * 64
89 194 storres
    if internalSollyaPrec < 192:
90 194 storres
        internalSollyaPrec = 192
91 194 storres
    pobyso_set_prec_sa_so(internalSollyaPrec)
92 194 storres
    print "Sollya internal precision:", internalSollyaPrec
93 194 storres
    ## Some variables.
94 194 storres
    ### General variables
95 194 storres
    lb                  = sdlb
96 194 storres
    ub                  = sdub
97 194 storres
    nbw                 = 0
98 194 storres
    intervalUlp         = ub.ulp()
99 194 storres
    #### Will be set by slz_interval_and_polynomila_to_sage.
100 194 storres
    ic                  = 0
101 194 storres
    icAsInt             = 0    # Set from ic.
102 194 storres
    solutionsSet        = set()
103 194 storres
    tsErrorWidth        = []
104 194 storres
    csErrorVectors      = []
105 194 storres
    csVectorsResultants = []
106 194 storres
    floatP              = 0  # Taylor polynomial.
107 194 storres
    floatPcv            = 0  # Ditto with variable change.
108 194 storres
    intvl               = "" # Taylor interval
109 194 storres
    terr                = 0  # Taylor error.
110 194 storres
    iterCount = 0
111 194 storres
    htrnSet = set()
112 194 storres
    ### Timers and counters.
113 194 storres
    wallTimeStart                   = 0
114 194 storres
    cpuTimeStart                    = 0
115 194 storres
    taylCondFailedCount             = 0
116 194 storres
    coppCondFailedCount             = 0
117 194 storres
    resultCondFailedCount           = 0
118 194 storres
    coppCondFailed                  = False
119 194 storres
    resultCondFailed                = False
120 194 storres
    globalResultsList               = []
121 194 storres
    basisConstructionsCount         = 0
122 194 storres
    basisConstructionsFullTime      = 0
123 194 storres
    basisConstructionTime           = 0
124 194 storres
    reductionsCount                 = 0
125 194 storres
    reductionsFullTime              = 0
126 194 storres
    reductionTime                   = 0
127 194 storres
    resultantsComputationsCount     = 0
128 194 storres
    resultantsComputationsFullTime  = 0
129 194 storres
    resultantsComputationTime       = 0
130 194 storres
    rootsComputationsCount          = 0
131 194 storres
    rootsComputationsFullTime       = 0
132 194 storres
    rootsComputationTime            = 0
133 194 storres
    print
134 194 storres
    ## Global times are started here.
135 194 storres
    wallTimeStart                   = walltime()
136 194 storres
    cpuTimeStart                    = cputime()
137 194 storres
    ## Main loop.
138 194 storres
    while True:
139 194 storres
        if lb >= sdub:
140 194 storres
            print "Lower bound reached upper bound."
141 194 storres
            break
142 194 storres
        if iterCount == maxIter:
143 194 storres
            print "Reached maxIter. Aborting"
144 194 storres
            break
145 194 storres
        iterCount += 1
146 194 storres
        print "[", lb, ",", ub, "]", ((ub - lb) / intervalUlp).log2().n(), \
147 194 storres
            "log2(numbers)."
148 194 storres
        ### Compute a Sollya polynomial that will honor the Taylor condition.
149 194 storres
        prceSo = slz_compute_polynomial_and_interval(scaledfSo,
150 194 storres
                                                     degreeSo,
151 194 storres
                                                     lb,
152 194 storres
                                                     ub,
153 194 storres
                                                     polyApproxAccur)
154 194 storres
        ### Convert back the data into Sage space.
155 194 storres
        (floatP, floatPcv, intvl, ic, terr) = \
156 194 storres
            slz_interval_and_polynomial_to_sage((prceSo[0], prceSo[0],
157 194 storres
                                                 prceSo[1], prceSo[2],
158 194 storres
                                                 prceSo[3]))
159 194 storres
        intvl = RRIF(intvl)
160 194 storres
        ## Clean-up Sollya stuff.
161 194 storres
        for elem in prceSo:
162 194 storres
            sollya_lib_clear_obj(elem)
163 194 storres
        #print  floatP, floatPcv, intvl, ic, terr
164 194 storres
        #print floatP
165 194 storres
        #print intvl.endpoints()[0].n(), \
166 194 storres
        #      ic.n(),
167 194 storres
        #intvl.endpoints()[1].n()
168 194 storres
        ### Check returned data.
169 194 storres
        #### Is approximation error OK?
170 194 storres
        if terr > polyApproxAccur:
171 194 storres
            exceptionErrorMess  = \
172 194 storres
                "Approximation failed - computed error:" + \
173 194 storres
                str(terr) + " - target error: "
174 194 storres
            exceptionErrorMess += \
175 194 storres
                str(polyApproxAccur) + ". Aborting!"
176 194 storres
            raise Exception(exceptionErrorMess)
177 194 storres
        #### Is lower bound OK?
178 194 storres
        if lb != intvl.endpoints()[0]:
179 194 storres
            exceptionErrorMess =  "Wrong lower bound:" + \
180 194 storres
                               str(lb) + ". Aborting!"
181 194 storres
            raise Exception(exceptionErrorMess)
182 194 storres
        #### Set upper bound.
183 194 storres
        if ub > intvl.endpoints()[1]:
184 194 storres
            ub = intvl.endpoints()[1]
185 194 storres
            print "[", lb, ",", ub, "]", ((ub - lb) / intervalUlp).log2().n(), \
186 194 storres
            "log2(numbers)."
187 194 storres
            taylCondFailedCount += 1
188 194 storres
        #### Is interval not degenerate?
189 194 storres
        if lb >= ub:
190 194 storres
            exceptionErrorMess = "Degenerate interval: " + \
191 194 storres
                                "lowerBound(" + str(lb) +\
192 194 storres
                                ")>= upperBound(" + str(ub) + \
193 194 storres
                                "). Aborting!"
194 194 storres
            raise Exception(exceptionErrorMess)
195 194 storres
        #### Is interval center ok?
196 194 storres
        if ic <= lb or ic >= ub:
197 194 storres
            exceptionErrorMess =  "Invalid interval center for " + \
198 194 storres
                                str(lb) + ',' + str(ic) + ',' +  \
199 194 storres
                                str(ub) + ". Aborting!"
200 194 storres
            raise Exception(exceptionErrorMess)
201 194 storres
        ##### Current interval width and reset future interval width.
202 194 storres
        bw = ub - lb
203 194 storres
        nbw = 0
204 194 storres
        icAsInt = int(ic * toIntegerFactor)
205 194 storres
        #### The following ratio is always >= 1. In case we may want to
206 194 storres
        #  enlarge the interval
207 194 storres
        curTaylErrRat = polyApproxAccur / terr
208 194 storres
        ## Make the  integral transformations.
209 194 storres
        ### First for interval center and bounds.
210 194 storres
        intIc = int(ic * toIntegerFactor)
211 194 storres
        intLb = int(lb * toIntegerFactor) - intIc
212 194 storres
        intUb = int(ub * toIntegerFactor) - intIc
213 194 storres
        #
214 194 storres
        #### For polynomials
215 194 storres
        basisConstructionTime         = cputime()
216 194 storres
        ##### To a polynomial with rational coefficients with rational arguments
217 194 storres
        ratRatP = slz_float_poly_of_float_to_rat_poly_of_rat_pow_two(floatP)
218 194 storres
        ##### To a polynomial with rational coefficients with integer arguments
219 194 storres
        ratIntP = \
220 194 storres
            slz_rat_poly_of_rat_to_rat_poly_of_int(ratRatP, precision)
221 194 storres
        #####  Ultimately a polynomial with integer coefficients with integer
222 194 storres
        #      arguments.
223 194 storres
        coppersmithTuple = \
224 194 storres
            slz_rat_poly_of_int_to_poly_for_coppersmith(ratIntP,
225 194 storres
                                                        precision,
226 194 storres
                                                        targetHardnessToRound,
227 194 storres
                                                        i, t)
228 194 storres
        #### Recover Coppersmith information.
229 194 storres
        intIntP = coppersmithTuple[0]
230 194 storres
        N = coppersmithTuple[1]
231 194 storres
        nAtAlpha = N^alpha
232 194 storres
        tBound = coppersmithTuple[2]
233 194 storres
        leastCommonMultiple = coppersmithTuple[3]
234 194 storres
        iBound = max(abs(intLb),abs(intUb))
235 194 storres
        basisConstructionsFullTime        += cputime(basisConstructionTime)
236 194 storres
        basisConstructionsCount           += 1
237 194 storres
        reductionTime                     = cputime()
238 194 storres
        # Compute the reduced polynomials.
239 194 storres
        ccReducedPolynomialsList =  \
240 194 storres
            slz_compute_coppersmith_reduced_polynomials(intIntP,
241 194 storres
                                                        alpha,
242 194 storres
                                                        N,
243 194 storres
                                                        iBound,
244 194 storres
                                                        tBound)
245 194 storres
        if ccReducedPolynomialsList is None:
246 194 storres
            raise Exception("Reduction failed.")
247 194 storres
        reductionsFullTime    += cputime(reductionTime)
248 194 storres
        reductionsCount       += 1
249 194 storres
        if len(ccReducedPolynomialsList) < 2:
250 194 storres
            print "Nothing to form resultants with."
251 194 storres
            print
252 194 storres
            coppCondFailedCount += 1
253 194 storres
            coppCondFailed = True
254 194 storres
            ##### Apply a different shrink factor according to
255 194 storres
            #  the number of compliant polynomials.
256 194 storres
            if len(ccReducedPolynomialsList) == 0:
257 194 storres
                ub = lb + bw * noCoppersmithIntervalShrink
258 194 storres
            else: # At least one compliant polynomial.
259 194 storres
                ub = lb + bw * oneCoppersmithIntervalShrink
260 194 storres
            if ub > sdub:
261 194 storres
                ub = sdub
262 194 storres
            if lb == ub:
263 194 storres
                raise Exception("Cant shrink interval \
264 194 storres
                anymore to get Coppersmith condition.")
265 194 storres
            nbw = 0
266 194 storres
            continue
267 194 storres
        #### We have at least two polynomials.
268 194 storres
        #    Let us try to compute resultants.
269 194 storres
        resultantsComputationTime      = cputime()
270 194 storres
        resultantsInTTuplesList = []
271 194 storres
        for polyOuterIndex in xrange(0, len(ccReducedPolynomialsList) - 1):
272 194 storres
            for polyInnerIndex in xrange(polyOuterIndex+1,
273 194 storres
                                         len(ccReducedPolynomialsList)):
274 194 storres
                resultantTuple = \
275 194 storres
                slz_resultant_tuple(ccReducedPolynomialsList[polyOuterIndex],
276 194 storres
                                ccReducedPolynomialsList[polyInnerIndex],
277 194 storres
                                t)
278 194 storres
                if len(resultantTuple) > 2:
279 194 storres
                    #print resultantTuple[2]
280 194 storres
                    resultantsInTTuplesList.append(resultantTuple)
281 194 storres
                else:
282 194 storres
                    print "No non nul resultant"
283 194 storres
        print len(resultantsInTTuplesList), "resultant(s) in t tuple(s) created."
284 194 storres
        resultantsComputationsFullTime += cputime(resultantsComputationTime)
285 194 storres
        resultantsComputationsCount    += 1
286 194 storres
        if len(resultantsInTTuplesList) == 0:
287 194 storres
            print "Only null resultants, shrinking interval."
288 194 storres
            resultCondFailed      =  True
289 194 storres
            resultCondFailedCount += 1
290 194 storres
            ### Shrink interval for next iteration.
291 194 storres
            ub = lb + bw * onlyNullResultantsShrink
292 194 storres
            if ub > sdub:
293 194 storres
                ub = sdub
294 194 storres
            nbw = 0
295 194 storres
            continue
296 194 storres
        #### Compute roots.
297 194 storres
        rootsComputationTime       = cputime()
298 194 storres
        reducedPolynomialsRootsSet = set()
299 194 storres
        ##### Solve in the second variable since resultants are in the first
300 194 storres
        #     variable.
301 194 storres
        for resultantInTTuple in resultantsInTTuplesList:
302 194 storres
            currentResultant = resultantInTTuple[2]
303 194 storres
            ##### If the resultant degree is not at least 1, there are no roots.
304 194 storres
            if currentResultant.degree() < 1:
305 194 storres
                print "Resultant is constant:", currentResultant
306 194 storres
                continue # Next resultantInTTuple
307 194 storres
            ##### Compute i roots
308 194 storres
            iRootsList = Zi(currentResultant).roots()
309 194 storres
            ##### For each iRoot, compute the corresponding tRoots and check
310 194 storres
            #     them in the input polynomial.
311 194 storres
            for iRoot in iRootsList:
312 194 storres
                ####### Roots returned by roots() are (value, multiplicity)
313 194 storres
                #       tuples.
314 194 storres
                #print "iRoot:", iRoot
315 194 storres
                ###### Use the tRoot against each polynomial, alternatively.
316 194 storres
                for indexInTuple in range(0,2):
317 194 storres
                    currentPolynomial = resultantInTTuple[indexInTuple]
318 194 storres
                    ####### If the polynomial is univariate, just drop it.
319 194 storres
                    if len(currentPolynomial.variables()) < 2:
320 194 storres
                        print "    Current polynomial is not in two variables."
321 194 storres
                        continue # Next indexInTuple
322 194 storres
                    tRootsList = \
323 194 storres
                        Zt(currentPolynomial.subs({currentPolynomial.variables()[0]:iRoot[0]})).roots()
324 194 storres
                    ####### The tRootsList can be empty, hence the test.
325 194 storres
                    if len(tRootsList) == 0:
326 194 storres
                        print "    No t root."
327 194 storres
                        continue # Next indexInTuple
328 194 storres
                    for tRoot in tRootsList:
329 194 storres
                        reducedPolynomialsRootsSet.add((iRoot[0], tRoot[0]))
330 194 storres
        # End of roots computation
331 194 storres
        rootsComputationsFullTime   =   cputime(rootsComputationTime)
332 194 storres
        rootsComputationsCount      +=  1
333 194 storres
        ##### Prepare for results.
334 194 storres
        intervalResultsList = []
335 194 storres
        intervalResultsList.append((lb, ub))
336 194 storres
        #### Check roots.
337 194 storres
        rootsResultsList = []
338 194 storres
        for root in reducedPolynomialsRootsSet:
339 194 storres
            specificRootResultsList = []
340 194 storres
            failingBounds = []
341 194 storres
            intIntPdivN = intIntP(root[0], root[1]) / N
342 194 storres
            if int(intIntPdivN) != intIntPdivN:
343 194 storres
                continue # Next root
344 194 storres
            # Root qualifies for modular equation, test it for hardness to round.
345 194 storres
            hardToRoundCaseAsFloat = RRR((icAsInt + root[0]) / toIntegerFactor)
346 194 storres
            #print "Before unscaling:", hardToRoundCaseAsFloat.n(prec=precision)
347 194 storres
            #print scalingFunction
348 194 storres
            scaledHardToRoundCaseAsFloat = \
349 194 storres
                scalingFunction(hardToRoundCaseAsFloat)
350 194 storres
            print "Candidate HTRNc at x =", \
351 194 storres
                scaledHardToRoundCaseAsFloat.n().str(base=2),
352 194 storres
            if slz_is_htrn(scaledHardToRoundCaseAsFloat,
353 194 storres
                           function,
354 194 storres
                           2^-(targetHardnessToRound),
355 194 storres
                           RRR):
356 194 storres
                print hardToRoundCaseAsFloat, "is HTRN case."
357 194 storres
                if lb <= hardToRoundCaseAsFloat and hardToRoundCaseAsFloat <= ub:
358 194 storres
                    print "Found in interval."
359 194 storres
                else:
360 194 storres
                    print "Found out of interval."
361 194 storres
                specificRootResultsList.append(hardToRoundCaseAsFloat.n().str(base=2))
362 194 storres
                # Check the root is in the bounds
363 194 storres
                if abs(root[0]) > iBound or abs(root[1]) > tBound:
364 194 storres
                    print "Root", root, "is out of bounds."
365 194 storres
                    if abs(root[0]) > iBound:
366 194 storres
                        print "root[0]:", root[0]
367 194 storres
                        print "i bound:", iBound
368 194 storres
                        failingBounds.append('i')
369 194 storres
                        failingBounds.append(root[0])
370 194 storres
                        failingBounds.append(iBound)
371 194 storres
                    if abs(root[1]) > tBound:
372 194 storres
                        print "root[1]:", root[1]
373 194 storres
                        print "t bound:", tBound
374 194 storres
                        failingBounds.append('t')
375 194 storres
                        failingBounds.append(root[1])
376 194 storres
                        failingBounds.append(tBound)
377 194 storres
                if len(failingBounds) > 0:
378 194 storres
                    specificRootResultsList.append(failingBounds)
379 194 storres
            else: # From slz_is_htrn...
380 194 storres
                print "is not an HTRN case."
381 194 storres
            if len(specificRootResultsList) > 0:
382 194 storres
                rootsResultsList.append(specificRootResultsList)
383 194 storres
        if len(rootsResultsList) > 0:
384 194 storres
            intervalResultsList.append(rootsResultsList)
385 194 storres
        #### An intervalResultsList has at least the bounds.
386 194 storres
        globalResultsList.append(intervalResultsList)
387 194 storres
        #### Compute an incremented width for next upper bound, only
388 194 storres
        #    if not Coppersmith condition nor resultant condition
389 194 storres
        #    failed at the previous run.
390 194 storres
        if not coppCondFailed and not resultCondFailed:
391 194 storres
            nbw = noErrorIntervalStretch * bw
392 194 storres
        else:
393 194 storres
            nbw = bw
394 194 storres
        ##### Reset the failure flags. They will be raised
395 194 storres
        #     again if needed.
396 194 storres
        coppCondFailed   = False
397 194 storres
        resultCondFailed = False
398 194 storres
        #### For next iteration (at end of loop)
399 194 storres
        #print "nbw:", nbw
400 194 storres
        lb  = ub
401 194 storres
        ub += nbw
402 194 storres
        if ub > sdub:
403 194 storres
            ub = sdub
404 194 storres
        print
405 194 storres
    # End while True
406 194 storres
    ## Main loop just ended.
407 194 storres
    globalWallTime = walltime(wallTimeStart)
408 194 storres
    globalCpuTime  = cputime(cpuTimeStart)
409 194 storres
    ## Output results
410 194 storres
    print ; print "Intervals and HTRNs" ; print
411 194 storres
    for intervalResultsList in globalResultsList:
412 194 storres
        print "[", intervalResultsList[0][0], ",",intervalResultsList[0][1], "]",
413 194 storres
        if len(intervalResultsList) > 1:
414 194 storres
            rootsResultsList = intervalResultsList[1]
415 194 storres
            for specificRootResultsList in rootsResultsList:
416 194 storres
                print "\t", specificRootResultsList[0],
417 194 storres
                if len(specificRootResultsList) > 1:
418 194 storres
                    print specificRootResultsList[1],
419 194 storres
        print ; print
420 194 storres
    #print globalResultsList
421 194 storres
    #
422 194 storres
    print "Timers and counters"
423 194 storres
    print
424 194 storres
    print "Number of iterations:", iterCount
425 194 storres
    print "Taylor condition failures:", taylCondFailedCount
426 194 storres
    print "Coppersmith condition failures:", coppCondFailedCount
427 194 storres
    print "Resultant condition failures:", resultCondFailedCount
428 194 storres
    print "Iterations count: ", iterCount
429 194 storres
    print "Number of intervals:", len(globalResultsList)
430 194 storres
    print "Number of basis constructions:", basisConstructionsCount
431 194 storres
    print "Total CPU time spent in basis constructions:", \
432 194 storres
        basisConstructionsFullTime
433 194 storres
    if basisConstructionsCount != 0:
434 194 storres
        print "Average basis construction CPU time:", \
435 194 storres
            basisConstructionsFullTime/basisConstructionsCount
436 194 storres
    print "Number of reductions:", reductionsCount
437 194 storres
    print "Total CPU time spent in reductions:", reductionsFullTime
438 194 storres
    if reductionsCount != 0:
439 194 storres
        print "Average reduction CPU time:", \
440 194 storres
            reductionsFullTime/reductionsCount
441 194 storres
    print "Number of resultants computation rounds:", \
442 194 storres
        resultantsComputationsCount
443 194 storres
    print "Total CPU time spent in resultants computation rounds:", \
444 194 storres
        resultantsComputationsFullTime
445 194 storres
    if resultantsComputationsCount != 0:
446 194 storres
        print "Average resultants computation round CPU time:", \
447 194 storres
            resultantsComputationsFullTime/resultantsComputationsCount
448 194 storres
    print "Number of root finding rounds:", rootsComputationsCount
449 194 storres
    print "Total CPU time spent in roots finding rounds:", \
450 194 storres
        rootsComputationsFullTime
451 194 storres
    if rootsComputationsCount != 0:
452 194 storres
        print "Average roots finding round CPU time:", \
453 194 storres
            rootsComputationsFullTime/rootsComputationsCount
454 194 storres
    print "Global Wall time:", globalWallTime
455 194 storres
    print "Global CPU time:", globalCpuTime
456 194 storres
    ## Output counters
457 194 storres
# End srs_runSLZ-v01
458 194 storres
459 194 storres
def srs_run_SLZ_v02(inputFunction,
460 194 storres
                    inputLowerBound,
461 194 storres
                    inputUpperBound,
462 194 storres
                    alpha,
463 194 storres
                    degree,
464 194 storres
                    precision,
465 194 storres
                    emin,
466 194 storres
                    emax,
467 194 storres
                    targetHardnessToRound,
468 194 storres
                    debug = False):
469 194 storres
    """
470 194 storres
    Changes from V1:
471 194 storres
        1- check for roots as soon as a resultant is computed;
472 194 storres
        2- once a non null resultant is found, check for roots;
473 194 storres
        3- constant resultant == no root.
474 194 storres
    """
475 194 storres
476 194 storres
    if debug:
477 194 storres
        print "Function                :", inputFunction
478 194 storres
        print "Lower bound             :", inputLowerBound
479 194 storres
        print "Upper bounds            :", inputUpperBound
480 194 storres
        print "Alpha                   :", alpha
481 194 storres
        print "Degree                  :", degree
482 194 storres
        print "Precision               :", precision
483 194 storres
        print "Emin                    :", emin
484 194 storres
        print "Emax                    :", emax
485 194 storres
        print "Target hardness-to-round:", targetHardnessToRound
486 194 storres
        print
487 194 storres
    ## Important constants.
488 194 storres
    ### Stretch the interval if no error happens.
489 194 storres
    noErrorIntervalStretch = 1 + 2^(-5)
490 194 storres
    ### If no vector validates the Coppersmith condition, shrink the interval
491 194 storres
    #   by the following factor.
492 194 storres
    noCoppersmithIntervalShrink = 1/2
493 194 storres
    ### If only (or at least) one vector validates the Coppersmith condition,
494 194 storres
    #   shrink the interval by the following factor.
495 194 storres
    oneCoppersmithIntervalShrink = 3/4
496 194 storres
    #### If only null resultants are found, shrink the interval by the
497 194 storres
    #    following factor.
498 194 storres
    onlyNullResultantsShrink     = 3/4
499 194 storres
    ## Structures.
500 194 storres
    RRR         = RealField(precision)
501 194 storres
    RRIF        = RealIntervalField(precision)
502 194 storres
    ## Converting input bound into the "right" field.
503 194 storres
    lowerBound = RRR(inputLowerBound)
504 194 storres
    upperBound = RRR(inputUpperBound)
505 194 storres
    ## Before going any further, check domain and image binade conditions.
506 194 storres
    print inputFunction(1).n()
507 194 storres
    (lb,ub) = slz_fix_bounds_for_binades(lowerBound, upperBound, inputFunction)
508 194 storres
    if lb != lowerBound or ub != upperBound:
509 194 storres
        print "lb:", lb, " - ub:", ub
510 194 storres
        print "Invalid domain/image binades. Domain:",\
511 194 storres
        lowerBound, upperBound, "Images:", \
512 194 storres
        inputFunction(lowerBound), inputFunction(upperBound)
513 194 storres
        raise Exception("Invalid domain/image binades.")
514 194 storres
    #
515 194 storres
    ## Progam initialization
516 194 storres
    ### Approximation polynomial accuracy and hardness to round.
517 194 storres
    polyApproxAccur           = 2^(-(targetHardnessToRound + 1))
518 194 storres
    polyTargetHardnessToRound = targetHardnessToRound + 1
519 194 storres
    ### Significand to integer conversion ratio.
520 194 storres
    toIntegerFactor           = 2^(precision-1)
521 194 storres
    print "Polynomial approximation required accuracy:", polyApproxAccur.n()
522 194 storres
    ### Variables and rings for polynomials and root searching.
523 194 storres
    i=var('i')
524 194 storres
    t=var('t')
525 194 storres
    inputFunctionVariable = inputFunction.variables()[0]
526 194 storres
    function = inputFunction.subs({inputFunctionVariable:i})
527 194 storres
    #  Polynomial Rings over the integers, for root finding.
528 194 storres
    Zi = ZZ[i]
529 194 storres
    Zt = ZZ[t]
530 194 storres
    Zit = ZZ[i,t]
531 194 storres
    ## Number of iterations limit.
532 194 storres
    maxIter = 100000
533 194 storres
    #
534 194 storres
    ## Compute the scaled function and the degree, in their Sollya version
535 194 storres
    #  once for all.
536 194 storres
    (scaledf, sdlb, sdub, silb, siub) = \
537 194 storres
        slz_compute_scaled_function(function, lowerBound, upperBound, precision)
538 194 storres
    print "Scaled function:", scaledf._assume_str().replace('_SAGE_VAR_', '')
539 194 storres
    scaledfSo = sollya_lib_parse_string(scaledf._assume_str().replace('_SAGE_VAR_', ''))
540 194 storres
    degreeSo  = pobyso_constant_from_int_sa_so(degree)
541 194 storres
    #
542 194 storres
    ## Compute the scaling. boundsIntervalRifSa defined out of the loops.
543 194 storres
    domainBoundsInterval   = RRIF(lowerBound, upperBound)
544 194 storres
    (unscalingFunction, scalingFunction) = \
545 194 storres
        slz_interval_scaling_expression(domainBoundsInterval, i)
546 194 storres
    #print scalingFunction, unscalingFunction
547 194 storres
    ## Set the Sollya internal precision (with an arbitrary minimum of 192).
548 194 storres
    internalSollyaPrec = ceil((RR('1.5') * targetHardnessToRound) / 64) * 64
549 194 storres
    if internalSollyaPrec < 192:
550 194 storres
        internalSollyaPrec = 192
551 194 storres
    pobyso_set_prec_sa_so(internalSollyaPrec)
552 194 storres
    print "Sollya internal precision:", internalSollyaPrec
553 194 storres
    ## Some variables.
554 194 storres
    ### General variables
555 194 storres
    lb                  = sdlb
556 194 storres
    ub                  = sdub
557 194 storres
    nbw                 = 0
558 194 storres
    intervalUlp         = ub.ulp()
559 194 storres
    #### Will be set by slz_interval_and_polynomila_to_sage.
560 194 storres
    ic                  = 0
561 194 storres
    icAsInt             = 0    # Set from ic.
562 194 storres
    solutionsSet        = set()
563 194 storres
    tsErrorWidth        = []
564 194 storres
    csErrorVectors      = []
565 194 storres
    csVectorsResultants = []
566 194 storres
    floatP              = 0  # Taylor polynomial.
567 194 storres
    floatPcv            = 0  # Ditto with variable change.
568 194 storres
    intvl               = "" # Taylor interval
569 194 storres
    terr                = 0  # Taylor error.
570 194 storres
    iterCount = 0
571 194 storres
    htrnSet = set()
572 194 storres
    ### Timers and counters.
573 194 storres
    wallTimeStart                   = 0
574 194 storres
    cpuTimeStart                    = 0
575 194 storres
    taylCondFailedCount             = 0
576 194 storres
    coppCondFailedCount             = 0
577 194 storres
    resultCondFailedCount           = 0
578 194 storres
    coppCondFailed                  = False
579 194 storres
    resultCondFailed                = False
580 194 storres
    globalResultsList               = []
581 194 storres
    basisConstructionsCount         = 0
582 194 storres
    basisConstructionsFullTime      = 0
583 194 storres
    basisConstructionTime           = 0
584 194 storres
    reductionsCount                 = 0
585 194 storres
    reductionsFullTime              = 0
586 194 storres
    reductionTime                   = 0
587 194 storres
    resultantsComputationsCount     = 0
588 194 storres
    resultantsComputationsFullTime  = 0
589 194 storres
    resultantsComputationTime       = 0
590 194 storres
    rootsComputationsCount          = 0
591 194 storres
    rootsComputationsFullTime       = 0
592 194 storres
    rootsComputationTime            = 0
593 194 storres
    print
594 194 storres
    ## Global times are started here.
595 194 storres
    wallTimeStart                   = walltime()
596 194 storres
    cpuTimeStart                    = cputime()
597 194 storres
    ## Main loop.
598 194 storres
    while True:
599 194 storres
        if lb >= sdub:
600 194 storres
            print "Lower bound reached upper bound."
601 194 storres
            break
602 194 storres
        if iterCount == maxIter:
603 194 storres
            print "Reached maxIter. Aborting"
604 194 storres
            break
605 194 storres
        iterCount += 1
606 194 storres
        print "[", lb, ",", ub, "]", ((ub - lb) / intervalUlp).log2().n(), \
607 194 storres
            "log2(numbers)."
608 194 storres
        ### Compute a Sollya polynomial that will honor the Taylor condition.
609 194 storres
        prceSo = slz_compute_polynomial_and_interval(scaledfSo,
610 194 storres
                                                     degreeSo,
611 194 storres
                                                     lb,
612 194 storres
                                                     ub,
613 194 storres
                                                     polyApproxAccur)
614 194 storres
        ### Convert back the data into Sage space.
615 194 storres
        (floatP, floatPcv, intvl, ic, terr) = \
616 194 storres
            slz_interval_and_polynomial_to_sage((prceSo[0], prceSo[0],
617 194 storres
                                                 prceSo[1], prceSo[2],
618 194 storres
                                                 prceSo[3]))
619 194 storres
        intvl = RRIF(intvl)
620 194 storres
        ## Clean-up Sollya stuff.
621 194 storres
        for elem in prceSo:
622 194 storres
            sollya_lib_clear_obj(elem)
623 194 storres
        #print  floatP, floatPcv, intvl, ic, terr
624 194 storres
        #print floatP
625 194 storres
        #print intvl.endpoints()[0].n(), \
626 194 storres
        #      ic.n(),
627 194 storres
        #intvl.endpoints()[1].n()
628 194 storres
        ### Check returned data.
629 194 storres
        #### Is approximation error OK?
630 194 storres
        if terr > polyApproxAccur:
631 194 storres
            exceptionErrorMess  = \
632 194 storres
                "Approximation failed - computed error:" + \
633 194 storres
                str(terr) + " - target error: "
634 194 storres
            exceptionErrorMess += \
635 194 storres
                str(polyApproxAccur) + ". Aborting!"
636 194 storres
            raise Exception(exceptionErrorMess)
637 194 storres
        #### Is lower bound OK?
638 194 storres
        if lb != intvl.endpoints()[0]:
639 194 storres
            exceptionErrorMess =  "Wrong lower bound:" + \
640 194 storres
                               str(lb) + ". Aborting!"
641 194 storres
            raise Exception(exceptionErrorMess)
642 194 storres
        #### Set upper bound.
643 194 storres
        if ub > intvl.endpoints()[1]:
644 194 storres
            ub = intvl.endpoints()[1]
645 194 storres
            print "[", lb, ",", ub, "]", ((ub - lb) / intervalUlp).log2().n(), \
646 194 storres
            "log2(numbers)."
647 194 storres
            taylCondFailedCount += 1
648 194 storres
        #### Is interval not degenerate?
649 194 storres
        if lb >= ub:
650 194 storres
            exceptionErrorMess = "Degenerate interval: " + \
651 194 storres
                                "lowerBound(" + str(lb) +\
652 194 storres
                                ")>= upperBound(" + str(ub) + \
653 194 storres
                                "). Aborting!"
654 194 storres
            raise Exception(exceptionErrorMess)
655 194 storres
        #### Is interval center ok?
656 194 storres
        if ic <= lb or ic >= ub:
657 194 storres
            exceptionErrorMess =  "Invalid interval center for " + \
658 194 storres
                                str(lb) + ',' + str(ic) + ',' +  \
659 194 storres
                                str(ub) + ". Aborting!"
660 194 storres
            raise Exception(exceptionErrorMess)
661 194 storres
        ##### Current interval width and reset future interval width.
662 194 storres
        bw = ub - lb
663 194 storres
        nbw = 0
664 194 storres
        icAsInt = int(ic * toIntegerFactor)
665 194 storres
        #### The following ratio is always >= 1. In case we may want to
666 197 storres
        #    enlarge the interval
667 194 storres
        curTaylErrRat = polyApproxAccur / terr
668 197 storres
        ### Make the  integral transformations.
669 197 storres
        #### Bounds and interval center.
670 194 storres
        intIc = int(ic * toIntegerFactor)
671 194 storres
        intLb = int(lb * toIntegerFactor) - intIc
672 194 storres
        intUb = int(ub * toIntegerFactor) - intIc
673 194 storres
        #
674 197 storres
        #### Polynomials
675 194 storres
        basisConstructionTime         = cputime()
676 194 storres
        ##### To a polynomial with rational coefficients with rational arguments
677 194 storres
        ratRatP = slz_float_poly_of_float_to_rat_poly_of_rat_pow_two(floatP)
678 194 storres
        ##### To a polynomial with rational coefficients with integer arguments
679 194 storres
        ratIntP = \
680 194 storres
            slz_rat_poly_of_rat_to_rat_poly_of_int(ratRatP, precision)
681 197 storres
        #####  Ultimately a multivariate polynomial with integer coefficients
682 197 storres
        #      with integer arguments.
683 194 storres
        coppersmithTuple = \
684 194 storres
            slz_rat_poly_of_int_to_poly_for_coppersmith(ratIntP,
685 194 storres
                                                        precision,
686 194 storres
                                                        targetHardnessToRound,
687 194 storres
                                                        i, t)
688 194 storres
        #### Recover Coppersmith information.
689 194 storres
        intIntP = coppersmithTuple[0]
690 194 storres
        N = coppersmithTuple[1]
691 194 storres
        nAtAlpha = N^alpha
692 194 storres
        tBound = coppersmithTuple[2]
693 194 storres
        leastCommonMultiple = coppersmithTuple[3]
694 194 storres
        iBound = max(abs(intLb),abs(intUb))
695 194 storres
        basisConstructionsFullTime        += cputime(basisConstructionTime)
696 194 storres
        basisConstructionsCount           += 1
697 194 storres
        reductionTime                     = cputime()
698 197 storres
        #### Compute the reduced polynomials.
699 194 storres
        ccReducedPolynomialsList =  \
700 194 storres
            slz_compute_coppersmith_reduced_polynomials(intIntP,
701 194 storres
                                                        alpha,
702 194 storres
                                                        N,
703 194 storres
                                                        iBound,
704 194 storres
                                                        tBound)
705 194 storres
        if ccReducedPolynomialsList is None:
706 194 storres
            raise Exception("Reduction failed.")
707 194 storres
        reductionsFullTime    += cputime(reductionTime)
708 194 storres
        reductionsCount       += 1
709 194 storres
        if len(ccReducedPolynomialsList) < 2:
710 194 storres
            print "Nothing to form resultants with."
711 194 storres
            print
712 194 storres
            coppCondFailedCount += 1
713 194 storres
            coppCondFailed = True
714 194 storres
            ##### Apply a different shrink factor according to
715 194 storres
            #  the number of compliant polynomials.
716 194 storres
            if len(ccReducedPolynomialsList) == 0:
717 194 storres
                ub = lb + bw * noCoppersmithIntervalShrink
718 194 storres
            else: # At least one compliant polynomial.
719 194 storres
                ub = lb + bw * oneCoppersmithIntervalShrink
720 194 storres
            if ub > sdub:
721 194 storres
                ub = sdub
722 194 storres
            if lb == ub:
723 194 storres
                raise Exception("Cant shrink interval \
724 194 storres
                anymore to get Coppersmith condition.")
725 194 storres
            nbw = 0
726 194 storres
            continue
727 194 storres
        #### We have at least two polynomials.
728 194 storres
        #    Let us try to compute resultants.
729 194 storres
        #    For each resultant computed, go for the solutions.
730 194 storres
        ##### Build the pairs list.
731 194 storres
        polyPairsList           = []
732 194 storres
        for polyOuterIndex in xrange(0, len(ccReducedPolynomialsList) - 1):
733 194 storres
            for polyInnerIndex in xrange(polyOuterIndex+1,
734 194 storres
                                         len(ccReducedPolynomialsList)):
735 194 storres
                polyPairsList.append((ccReducedPolynomialsList[polyOuterIndex],
736 194 storres
                                      ccReducedPolynomialsList[polyInnerIndex]))
737 197 storres
        #### Actual root search.
738 197 storres
        rootsSet            = set()
739 197 storres
        hasNonNullResultant = False
740 194 storres
        for polyPair in polyPairsList:
741 197 storres
            if hasNonNullResultant:
742 197 storres
                break
743 197 storres
            resultantsComputationTime   = cputime()
744 197 storres
            currentResultant = \
745 197 storres
                slz_resultant(polyPair[0],
746 197 storres
                              polyPair[1],
747 197 storres
                              t)
748 194 storres
            resultantsComputationsFullTime += cputime(resultantsComputationTime)
749 194 storres
            resultantsComputationsCount    += 1
750 197 storres
            if currentResultant is None:
751 197 storres
                print "Nul resultant"
752 197 storres
                continue # Next polyPair.
753 197 storres
            else:
754 194 storres
                hasNonNullResultant = True
755 197 storres
            #### We have a non null resultant. From now on, whatever the
756 197 storres
            #    root search yields, no extra root search is necessary.
757 197 storres
            #### A constant resultant leads to no root. Root search is done.
758 194 storres
            if currentResultant.degree() < 1:
759 194 storres
                print "Resultant is constant:", currentResultant
760 197 storres
                continue # Next polyPair and should break.
761 197 storres
            #### Actual roots computation.
762 197 storres
            rootsComputationTime       = cputime()
763 194 storres
            ##### Compute i roots
764 194 storres
            iRootsList = Zi(currentResultant).roots()
765 197 storres
            ##### For each iRoot, compute the corresponding tRoots and
766 197 storres
            #     and build populate the .rootsSet.
767 194 storres
            for iRoot in iRootsList:
768 194 storres
                ####### Roots returned by roots() are (value, multiplicity)
769 194 storres
                #       tuples.
770 194 storres
                #print "iRoot:", iRoot
771 194 storres
                ###### Use the tRoot against each polynomial, alternatively.
772 197 storres
                for indexInPair in range(0,2):
773 197 storres
                    currentPolynomial = polyPair[indexInPair]
774 194 storres
                    ####### If the polynomial is univariate, just drop it.
775 194 storres
                    if len(currentPolynomial.variables()) < 2:
776 194 storres
                        print "    Current polynomial is not in two variables."
777 197 storres
                        continue # Next indexInPair
778 194 storres
                    tRootsList = \
779 194 storres
                        Zt(currentPolynomial.subs({currentPolynomial.variables()[0]:iRoot[0]})).roots()
780 194 storres
                    ####### The tRootsList can be empty, hence the test.
781 194 storres
                    if len(tRootsList) == 0:
782 194 storres
                        print "    No t root."
783 197 storres
                        continue # Next indexInPair
784 194 storres
                    for tRoot in tRootsList:
785 197 storres
                        rootsSet.add((iRoot[0], tRoot[0]))
786 197 storres
            # End of roots computation.
787 197 storres
            rootsComputationsFullTime   =   cputime(rootsComputationTime)
788 197 storres
            rootsComputationsCount      +=  1
789 197 storres
        # End loop for polyPair in polyParsList.  Will break at next iteration.
790 197 storres
        # since a non null resultant was found.
791 197 storres
        #### Prepare for results for the current interval..
792 194 storres
        intervalResultsList = []
793 194 storres
        intervalResultsList.append((lb, ub))
794 194 storres
        #### Check roots.
795 194 storres
        rootsResultsList = []
796 197 storres
        for root in rootsSet:
797 194 storres
            specificRootResultsList = []
798 194 storres
            failingBounds = []
799 194 storres
            intIntPdivN = intIntP(root[0], root[1]) / N
800 194 storres
            if int(intIntPdivN) != intIntPdivN:
801 194 storres
                continue # Next root
802 194 storres
            # Root qualifies for modular equation, test it for hardness to round.
803 194 storres
            hardToRoundCaseAsFloat = RRR((icAsInt + root[0]) / toIntegerFactor)
804 194 storres
            #print "Before unscaling:", hardToRoundCaseAsFloat.n(prec=precision)
805 194 storres
            #print scalingFunction
806 194 storres
            scaledHardToRoundCaseAsFloat = \
807 194 storres
                scalingFunction(hardToRoundCaseAsFloat)
808 194 storres
            print "Candidate HTRNc at x =", \
809 194 storres
                scaledHardToRoundCaseAsFloat.n().str(base=2),
810 194 storres
            if slz_is_htrn(scaledHardToRoundCaseAsFloat,
811 194 storres
                           function,
812 194 storres
                           2^-(targetHardnessToRound),
813 194 storres
                           RRR):
814 194 storres
                print hardToRoundCaseAsFloat, "is HTRN case."
815 194 storres
                if lb <= hardToRoundCaseAsFloat and hardToRoundCaseAsFloat <= ub:
816 194 storres
                    print "Found in interval."
817 194 storres
                else:
818 194 storres
                    print "Found out of interval."
819 194 storres
                specificRootResultsList.append(hardToRoundCaseAsFloat.n().str(base=2))
820 194 storres
                # Check the root is in the bounds
821 194 storres
                if abs(root[0]) > iBound or abs(root[1]) > tBound:
822 197 storres
                    print "Root", root, "is out of bounds for modular equation."
823 194 storres
                    if abs(root[0]) > iBound:
824 194 storres
                        print "root[0]:", root[0]
825 194 storres
                        print "i bound:", iBound
826 194 storres
                        failingBounds.append('i')
827 194 storres
                        failingBounds.append(root[0])
828 194 storres
                        failingBounds.append(iBound)
829 194 storres
                    if abs(root[1]) > tBound:
830 194 storres
                        print "root[1]:", root[1]
831 194 storres
                        print "t bound:", tBound
832 194 storres
                        failingBounds.append('t')
833 194 storres
                        failingBounds.append(root[1])
834 194 storres
                        failingBounds.append(tBound)
835 194 storres
                if len(failingBounds) > 0:
836 194 storres
                    specificRootResultsList.append(failingBounds)
837 194 storres
            else: # From slz_is_htrn...
838 194 storres
                print "is not an HTRN case."
839 194 storres
            if len(specificRootResultsList) > 0:
840 194 storres
                rootsResultsList.append(specificRootResultsList)
841 194 storres
        if len(rootsResultsList) > 0:
842 194 storres
            intervalResultsList.append(rootsResultsList)
843 197 storres
        ### Check if a non null resultant was found. If not shrink the interval.
844 197 storres
        if not hasNonNullResultant:
845 197 storres
            print "Only null resultants for this reduction, shrinking interval."
846 197 storres
            resultCondFailed      =  True
847 197 storres
            resultCondFailedCount += 1
848 197 storres
            ### Shrink interval for next iteration.
849 197 storres
            ub = lb + bw * onlyNullResultantsShrink
850 197 storres
            if ub > sdub:
851 197 storres
                ub = sdub
852 197 storres
            nbw = 0
853 197 storres
            continue
854 194 storres
        #### An intervalResultsList has at least the bounds.
855 194 storres
        globalResultsList.append(intervalResultsList)
856 194 storres
        #### Compute an incremented width for next upper bound, only
857 194 storres
        #    if not Coppersmith condition nor resultant condition
858 194 storres
        #    failed at the previous run.
859 194 storres
        if not coppCondFailed and not resultCondFailed:
860 194 storres
            nbw = noErrorIntervalStretch * bw
861 194 storres
        else:
862 194 storres
            nbw = bw
863 194 storres
        ##### Reset the failure flags. They will be raised
864 194 storres
        #     again if needed.
865 194 storres
        coppCondFailed   = False
866 194 storres
        resultCondFailed = False
867 194 storres
        #### For next iteration (at end of loop)
868 194 storres
        #print "nbw:", nbw
869 194 storres
        lb  = ub
870 194 storres
        ub += nbw
871 194 storres
        if ub > sdub:
872 194 storres
            ub = sdub
873 194 storres
        print
874 194 storres
    # End while True
875 194 storres
    ## Main loop just ended.
876 194 storres
    globalWallTime = walltime(wallTimeStart)
877 194 storres
    globalCpuTime  = cputime(cpuTimeStart)
878 194 storres
    ## Output results
879 194 storres
    print ; print "Intervals and HTRNs" ; print
880 194 storres
    for intervalResultsList in globalResultsList:
881 194 storres
        print "[", intervalResultsList[0][0], ",",intervalResultsList[0][1], "]",
882 194 storres
        if len(intervalResultsList) > 1:
883 194 storres
            rootsResultsList = intervalResultsList[1]
884 194 storres
            for specificRootResultsList in rootsResultsList:
885 194 storres
                print "\t", specificRootResultsList[0],
886 194 storres
                if len(specificRootResultsList) > 1:
887 194 storres
                    print specificRootResultsList[1],
888 194 storres
        print ; print
889 194 storres
    #print globalResultsList
890 194 storres
    #
891 194 storres
    print "Timers and counters"
892 194 storres
    print
893 194 storres
    print "Number of iterations:", iterCount
894 194 storres
    print "Taylor condition failures:", taylCondFailedCount
895 194 storres
    print "Coppersmith condition failures:", coppCondFailedCount
896 194 storres
    print "Resultant condition failures:", resultCondFailedCount
897 194 storres
    print "Iterations count: ", iterCount
898 194 storres
    print "Number of intervals:", len(globalResultsList)
899 194 storres
    print "Number of basis constructions:", basisConstructionsCount
900 194 storres
    print "Total CPU time spent in basis constructions:", \
901 194 storres
        basisConstructionsFullTime
902 194 storres
    if basisConstructionsCount != 0:
903 194 storres
        print "Average basis construction CPU time:", \
904 194 storres
            basisConstructionsFullTime/basisConstructionsCount
905 194 storres
    print "Number of reductions:", reductionsCount
906 194 storres
    print "Total CPU time spent in reductions:", reductionsFullTime
907 194 storres
    if reductionsCount != 0:
908 194 storres
        print "Average reduction CPU time:", \
909 194 storres
            reductionsFullTime/reductionsCount
910 194 storres
    print "Number of resultants computation rounds:", \
911 194 storres
        resultantsComputationsCount
912 194 storres
    print "Total CPU time spent in resultants computation rounds:", \
913 194 storres
        resultantsComputationsFullTime
914 194 storres
    if resultantsComputationsCount != 0:
915 194 storres
        print "Average resultants computation round CPU time:", \
916 194 storres
            resultantsComputationsFullTime/resultantsComputationsCount
917 194 storres
    print "Number of root finding rounds:", rootsComputationsCount
918 194 storres
    print "Total CPU time spent in roots finding rounds:", \
919 194 storres
        rootsComputationsFullTime
920 194 storres
    if rootsComputationsCount != 0:
921 194 storres
        print "Average roots finding round CPU time:", \
922 194 storres
            rootsComputationsFullTime/rootsComputationsCount
923 194 storres
    print "Global Wall time:", globalWallTime
924 194 storres
    print "Global CPU time:", globalCpuTime
925 194 storres
    ## Output counters
926 194 storres
# End srs_runSLZ-v02