103 |
103 |
# End spo_get_coefficient_for_monomial.
|
104 |
104 |
|
105 |
105 |
|
106 |
|
def spo_expression_as_string(powI, powT, powP, powN):
|
|
106 |
def spo_expression_as_string(powI, boundI, powT, boundT, powP, powN):
|
107 |
107 |
"""
|
108 |
108 |
Computes a string version of the i^k + t^l + p^m + N^n expression for
|
109 |
109 |
output.
|
110 |
110 |
"""
|
111 |
111 |
expressionAsString =""
|
112 |
112 |
if powI != 0:
|
113 |
|
expressionAsString += "i^" + str(powI)
|
|
113 |
expressionAsString += str(iBound^powI) + " i^" + str(powI)
|
114 |
114 |
if powT != 0:
|
115 |
115 |
if len(expressionAsString) != 0:
|
116 |
116 |
expressionAsString += " * "
|
117 |
|
expressionAsString += "t^" + str(powT)
|
|
117 |
expressionAsString += str(tBound^powT) + " t^" + str(powT)
|
118 |
118 |
if powP != 0:
|
119 |
119 |
if len(expressionAsString) != 0:
|
120 |
120 |
expressionAsString += " * "
|
... | ... | |
396 |
396 |
return ((protoMatrixRows, knownMonomials, polynomialsList))
|
397 |
397 |
# End spo_polynomial_to_proto_matrix
|
398 |
398 |
|
399 |
|
def spo_polynomial_to_polynomials_list_2(p, alpha, N, columnsWidth=0):
|
|
399 |
def spo_polynomial_to_polynomials_list_2(p, alpha, N, iBound, tBound,
|
|
400 |
columnsWidth=0):
|
400 |
401 |
"""
|
401 |
402 |
From p, alpha, N build a list of polynomials...
|
402 |
403 |
TODO: clean up the comments below!
|
... | ... | |
448 |
449 |
# No t power is taken into account as we limit our selves to
|
449 |
450 |
# degree 1 in t and make no "t-shifts".
|
450 |
451 |
if columnsWidth != 0:
|
451 |
|
polExpStr = spo_expression_as_string(iPower,
|
|
452 |
polExpStr = spo_expression_as_string(iPower,
|
|
453 |
iBound,
|
452 |
454 |
0,
|
|
455 |
tBound,
|
453 |
456 |
0,
|
454 |
457 |
alpha)
|
455 |
458 |
print "->", polExpStr
|
456 |
|
currentExpression = iVariable^iPower * nAtAlpha
|
|
459 |
currentExpression = iVariable^iPower * nAtAlpha * iBound^iPower
|
457 |
460 |
# polynomialAtPower == 1 here. Next line should be commented
|
458 |
461 |
# out but it does not work! Some conversion problem?
|
459 |
462 |
currentPolynomial = pRing(currentExpression)
|
... | ... | |
464 |
467 |
# polynomial. This is also where the t^pPower monomials shows up for
|
465 |
468 |
# the first time.
|
466 |
469 |
if columnsWidth != 0:
|
467 |
|
polExpStr = spo_expression_as_string(0, 0, pPower, alpha-pPower)
|
|
470 |
polExpStr = spo_expression_as_string(0, iBound, 0, tBound, \
|
|
471 |
pPower, alpha-pPower)
|
468 |
472 |
print "->", polExpStr
|
469 |
473 |
currentPolynomial = polynomialAtPower * nAtPower
|
470 |
474 |
polynomialsList.append(currentPolynomial)
|
... | ... | |
485 |
489 |
internalIpower = iPower
|
486 |
490 |
for tPower in xrange(pPower,0,-1):
|
487 |
491 |
if columnsWidth != 0:
|
488 |
|
polExpStr = spo_expression_as_string(internalIpower, \
|
489 |
|
tPower, \
|
490 |
|
0, \
|
|
492 |
polExpStr = spo_expression_as_string(internalIpower,
|
|
493 |
iBound,
|
|
494 |
tPower,
|
|
495 |
tBound,
|
|
496 |
0,
|
491 |
497 |
alpha)
|
492 |
498 |
print "->", polExpStr
|
493 |
|
currentExpression = i^internalIpower * t^tPower * nAtAlpha
|
|
499 |
currentExpression = i^internalIpower * t^tPower * \
|
|
500 |
nAtAlpha * iBound^internalIpower * \
|
|
501 |
tBound^tPower
|
|
502 |
|
494 |
503 |
currentPolynomial = pRing(currentExpression)
|
495 |
504 |
polynomialsList.append(currentPolynomial)
|
496 |
505 |
internalIpower += pIdegree
|
497 |
506 |
# End for tPower
|
498 |
507 |
# The i^iPower * p^pPower * N^(alpha-pPower) i-shift.
|
499 |
508 |
if columnsWidth != 0:
|
500 |
|
polExpStr = spo_expression_as_string(iPower, \
|
501 |
|
0, \
|
502 |
|
pPower, \
|
|
509 |
polExpStr = spo_expression_as_string(iPower,
|
|
510 |
iBound,
|
|
511 |
0,
|
|
512 |
tBound,
|
|
513 |
pPower,
|
503 |
514 |
alpha-pPower)
|
504 |
515 |
print "->", polExpStr
|
505 |
|
currentExpression = i^iPower * nAtPower
|
|
516 |
currentExpression = i^iPower * nAtPower * iBound^iPower
|
506 |
517 |
currentPolynomial = pRing(currentExpression) * polynomialAtPower
|
507 |
518 |
polynomialsList.append(currentPolynomial)
|
508 |
519 |
# End for iPower
|
... | ... | |
512 |
523 |
return polynomialsList
|
513 |
524 |
# End spo_polynomial_to_proto_matrix_2
|
514 |
525 |
|
515 |
|
def spo_polynomial_to_polynomials_list_3(p, alpha, N, iBound, tBound, \
|
|
526 |
def spo_polynomial_to_polynomials_list_3(p, alpha, N, iBound, tBound,
|
516 |
527 |
columnsWidth=0):
|
517 |
528 |
"""
|
518 |
529 |
From p, alpha, N build a list of polynomials...
|
... | ... | |
532 |
543 |
printed in colums of columnsWitdth width.
|
533 |
544 |
"""
|
534 |
545 |
pRing = p.parent()
|
535 |
|
knownMonomials = []
|
536 |
546 |
polynomialsList = []
|
537 |
547 |
pVariables = p.variables()
|
538 |
548 |
iVariable = pVariables[0]
|
... | ... | |
556 |
566 |
# degree 1 in t and make no "t-shifts".
|
557 |
567 |
if columnsWidth != 0:
|
558 |
568 |
polExpStr = spo_expression_as_string(iPower,
|
|
569 |
iBound,
|
559 |
570 |
0,
|
|
571 |
tBound,
|
560 |
572 |
0,
|
561 |
573 |
alpha)
|
562 |
574 |
print "->", polExpStr
|
563 |
|
currentExpression = iVariable^iPower * nAtAlpha
|
|
575 |
currentExpression = iVariable^iPower * nAtAlpha * iBound^iPower
|
564 |
576 |
# polynomialAtPower == 1 here. Next line should be commented
|
565 |
577 |
# out but it does not work! Some conversion problem?
|
566 |
578 |
currentPolynomial = pRing(currentExpression)
|
... | ... | |
571 |
583 |
# polynomial. This is also where the t^pPower monomials shows up for
|
572 |
584 |
# the first time. It app
|
573 |
585 |
if columnsWidth != 0:
|
574 |
|
polExpStr = spo_expression_as_string(0, 0, pPower, alpha-pPower)
|
|
586 |
polExpStr = spo_expression_as_string(0, iBound,
|
|
587 |
0, tBound,
|
|
588 |
pPower, alpha-pPower)
|
575 |
589 |
print "->", polExpStr
|
576 |
590 |
currentPolynomial = polynomialAtPower * nAtPower
|
577 |
591 |
polynomialsList.append(currentPolynomial)
|
578 |
592 |
# Exit when pPower == alpha
|
579 |
593 |
if pPower == alpha:
|
580 |
|
return((knownMonomials, polynomialsList))
|
|
594 |
return polynomialsList
|
581 |
595 |
# This is where the "i-shifts" take place. Mixed terms, i^k * t^l
|
582 |
596 |
# (that were introduced at a previous
|
583 |
597 |
# stage or are introduced now) are only shifted to already existing
|
... | ... | |
592 |
606 |
internalIpower = iPower
|
593 |
607 |
for tPower in xrange(pPower,0,-1):
|
594 |
608 |
if columnsWidth != 0:
|
595 |
|
polExpStr = spo_expression_as_string(internalIpower, \
|
596 |
|
tPower, \
|
597 |
|
0, \
|
|
609 |
polExpStr = spo_expression_as_string(internalIpower,
|
|
610 |
iBound,
|
|
611 |
tPower,
|
|
612 |
tBound,
|
|
613 |
0,
|
598 |
614 |
alpha)
|
599 |
615 |
print "->", polExpStr
|
600 |
|
currentExpression = i^internalIpower * t^tPower * nAtAlpha
|
|
616 |
currentExpression = i^internalIpower * t^tPower * nAtAlpha * \
|
|
617 |
iBound^internalIpower * tBound^tPower
|
601 |
618 |
currentPolynomial = pRing(currentExpression)
|
602 |
619 |
polynomialsList.append(currentPolynomial)
|
603 |
620 |
internalIpower += pIdegree
|
604 |
621 |
# End for tPower
|
605 |
622 |
# Here we have to choose between a
|
606 |
623 |
# i^iPower * p^pPower * N^(alpha-pPower) i-shift and
|
607 |
|
# i^iPower * i^(d_i(p) * pPower) * N^alpha, depend on which
|
|
624 |
# i^iPower * i^(d_i(p) * pPower) * N^alpha, depending on which
|
608 |
625 |
# coefficient is smallest.
|
609 |
626 |
IcurrentExponent = iPower + \
|
610 |
|
(pPower * polynomialAtPower.degree(i))
|
611 |
|
currentMonomial = pRing(i^(IcurrentExponent))
|
612 |
|
currentPolynomial = pRing(i^iPower * nAtPower) * \
|
613 |
|
polynomialAtPower
|
|
627 |
(pPower * polynomialAtPower.degree(iVariable))
|
|
628 |
currentMonomial = pRing(iVariable^IcurrentExponent)
|
|
629 |
currentPolynomial = pRing(iVariable^iPower * nAtPower * \
|
|
630 |
iBound^iPower) * \
|
|
631 |
polynomialAtPower
|
614 |
632 |
currMonomials = currentPolynomial.monomials()
|
615 |
633 |
currCoefficients = currentPolynomial.coefficients()
|
616 |
634 |
currentCoefficient = spo_get_coefficient_for_monomial( \
|
617 |
635 |
currMonomials,
|
618 |
636 |
currCoefficients,
|
619 |
637 |
currentMonomial)
|
620 |
|
if currentCoefficient > nAtAlpha:
|
|
638 |
print "Current coefficient:", currentCoefficient
|
|
639 |
alterCoefficient = iBound^IcurrentExponent * nAtAlpha
|
|
640 |
print "N^alpha * ibound^", IcurrentExponent, ":", \
|
|
641 |
alterCoefficient
|
|
642 |
if currentCoefficient > alterCoefficient :
|
621 |
643 |
if columnsWidth != 0:
|
622 |
|
polExpStr = spo_expression_as_string(IcurrentCoefficient, \
|
623 |
|
0, \
|
624 |
|
0, \
|
|
644 |
polExpStr = spo_expression_as_string(IcurrentExponent,
|
|
645 |
iBound,
|
|
646 |
0,
|
|
647 |
tBound,
|
|
648 |
0,
|
625 |
649 |
alpha)
|
626 |
|
print "->", polExpStr
|
627 |
|
polynomialsList.append(currentMonomial * nAtAlpha)
|
|
650 |
print "->", polExpStr
|
|
651 |
polynomialsList.append(currentMonomial * \
|
|
652 |
alterCoefficient)
|
628 |
653 |
else:
|
629 |
654 |
if columnsWidth != 0:
|
630 |
|
polExpStr = spo_expression_as_string(iPower, \
|
631 |
|
0, \
|
632 |
|
pPower, \
|
|
655 |
polExpStr = spo_expression_as_string(iPower, iBound,
|
|
656 |
0, tBound,
|
|
657 |
pPower,
|
633 |
658 |
alpha-pPower)
|
634 |
|
print "->", polExpStr
|
|
659 |
print "->", polExpStr
|
635 |
660 |
polynomialsList.append(currentPolynomial)
|
636 |
661 |
# End for iPower
|
637 |
662 |
polynomialAtPower *= p
|
... | ... | |
640 |
665 |
return polynomialsList
|
641 |
666 |
# End spo_polynomial_to_proto_matrix_3
|
642 |
667 |
|
643 |
|
def spo_proto_to_column_matrix(protoMatrixColumns, \
|
644 |
|
knownMonomialsList, \
|
645 |
|
boundVar1, \
|
646 |
|
boundVar2):
|
|
668 |
def spo_polynomial_to_polynomials_list_4(p, alpha, N, iBound, tBound,
|
|
669 |
columnsWidth=0):
|
647 |
670 |
"""
|
648 |
|
Create a column (each row holds the coefficients of one monomial) matrix.
|
|
671 |
From p, alpha, N build a list of polynomials...
|
|
672 |
TODO: more in depth rationale...
|
649 |
673 |
|
|
674 |
Our goal is to introduce each monomial with the smallest coefficient.
|
|
675 |
|
|
676 |
|
|
677 |
|
650 |
678 |
Parameters
|
651 |
679 |
----------
|
|
680 |
p: the (bivariate) polynomial;
|
|
681 |
pRing: the ring over which p is defined;
|
|
682 |
alpha:
|
|
683 |
N:
|
|
684 |
columsWidth: if == 0, no information is displayed, otherwise data is
|
|
685 |
printed in colums of columnsWitdth width.
|
|
686 |
"""
|
|
687 |
pRing = p.parent()
|
|
688 |
polynomialsList = []
|
|
689 |
pVariables = p.variables()
|
|
690 |
iVariable = pVariables[0]
|
|
691 |
tVariable = pVariables[1]
|
|
692 |
polynomialAtPower = copy(p)
|
|
693 |
currentPolynomial = pRing(1)
|
|
694 |
pIdegree = p.degree(iVariable)
|
|
695 |
pTdegree = p.degree(tVariable)
|
|
696 |
maxIdegree = pIdegree * alpha
|
|
697 |
currentIdegree = currentPolynomial.degree(iVariable)
|
|
698 |
nAtAlpha = N^alpha
|
|
699 |
nAtPower = nAtAlpha
|
|
700 |
polExpStr = ""
|
|
701 |
# We first introduce all the monomials in i alone multiplied by N^alpha.
|
|
702 |
for iPower in xrange(0, maxIdegree + 1):
|
|
703 |
if columnsWidth !=0:
|
|
704 |
polExpStr = spo_expression_as_string(iPower, iBound,
|
|
705 |
0, tBound,
|
|
706 |
0, alpha)
|
|
707 |
print "->", polExpStr
|
|
708 |
currentExpression = iVariable^iPower * nAtAlpha * iBound^iPower
|
|
709 |
currentPolynomial = pRing(currentExpression)
|
|
710 |
polynomialsList.append(currentPolynomial)
|
|
711 |
# End for iPower
|
|
712 |
# We work from p^1 * N^alpha-1 to p^alpha * N^0
|
|
713 |
for pPower in xrange(1, alpha + 1):
|
|
714 |
# First of all the p^pPower * N^(alpha-pPower) polynomial.
|
|
715 |
nAtPower /= N
|
|
716 |
if columnsWidth !=0:
|
|
717 |
polExpStr = spo_expression_as_string(0, iBound,
|
|
718 |
0, tBound,
|
|
719 |
pPower, alpha-pPower)
|
|
720 |
print "->", polExpStr
|
|
721 |
currentPolynomial = polynomialAtPower * nAtPower
|
|
722 |
polynomialsList.append(currentPolynomial)
|
|
723 |
# Exit when pPower == alpha
|
|
724 |
if pPower == alpha:
|
|
725 |
return polynomialsList
|
|
726 |
# We now introduce the mixed i^k * t^l monomials by i^m * p^n * N^(alpha-n)
|
|
727 |
for iPower in xrange(1, pIdegree + 1):
|
|
728 |
if columnsWidth != 0:
|
|
729 |
polExpStr = spo_expression_as_string(iPower, iBound,
|
|
730 |
0, tBound,
|
|
731 |
pPower, alpha-pPower)
|
|
732 |
print "->", polExpStr
|
|
733 |
currentExpression = i^iPower * iBound^iPower * nAtPower
|
|
734 |
currentPolynomial = pRing(currentExpression) * polynomialAtPower
|
|
735 |
polynomialsList.append(currentPolynomial)
|
|
736 |
# End for iPower
|
|
737 |
polynomialAtPower *= p
|
|
738 |
# End for pPower loop
|
|
739 |
return polynomialsList
|
|
740 |
# End spo_polynomial_to_proto_matrix_4
|
|
741 |
|
|
742 |
def spo_proto_to_column_matrix(protoMatrixColumns):
|
|
743 |
"""
|
|
744 |
Create a column (each row holds the coefficients for one monomial) matrix.
|
|
745 |
|
|
746 |
Parameters
|
|
747 |
----------
|
652 |
748 |
protoMatrixColumns: a list of coefficient lists.
|
653 |
749 |
"""
|
654 |
750 |
numColumns = len(protoMatrixColumns)
|
... | ... | |
663 |
759 |
for rowIndex in xrange(0, len(protoMatrixColumns[colIndex])):
|
664 |
760 |
if protoMatrixColumns[colIndex][rowIndex] != 0:
|
665 |
761 |
baseMatrix[rowIndex, colIndex] = \
|
666 |
|
protoMatrixColumns[colIndex][rowIndex] * \
|
667 |
|
knownMonomialsList[rowIndex](boundVar1, boundVar2)
|
|
762 |
protoMatrixColumns[colIndex][rowIndex]
|
668 |
763 |
return baseMatrix
|
669 |
764 |
# End spo_proto_to_column_matrix.
|
670 |
765 |
#
|
671 |
|
def spo_proto_to_row_matrix(protoMatrixRows, \
|
672 |
|
knownMonomialsList, \
|
673 |
|
boundVar1, \
|
674 |
|
boundVar2):
|
|
766 |
def spo_proto_to_row_matrix(protoMatrixRows):
|
675 |
767 |
"""
|
676 |
|
Create a row (each column holds the evaluation one monomial at boundVar1 and
|
677 |
|
boundVar2 values) matrix.
|
|
768 |
Create a row (each column holds the coefficients corresponding to one
|
|
769 |
monomial) matrix from the protoMatrixRows list.
|
678 |
770 |
|
679 |
771 |
Parameters
|
680 |
772 |
----------
|
... | ... | |
692 |
784 |
for colIndex in xrange(0, len(protoMatrixRows[rowIndex])):
|
693 |
785 |
if protoMatrixRows[rowIndex][colIndex] != 0:
|
694 |
786 |
baseMatrix[rowIndex, colIndex] = \
|
695 |
|
protoMatrixRows[rowIndex][colIndex] * \
|
696 |
|
knownMonomialsList[colIndex](boundVar1,boundVar2)
|
|
787 |
protoMatrixRows[rowIndex][colIndex]
|
697 |
788 |
#print rowIndex, colIndex,
|
698 |
789 |
#print protoMatrixRows[rowIndex][colIndex],
|
699 |
790 |
#print knownMonomialsList[colIndex](boundVar1,boundVar2)
|