本文整理汇总了Python中sage.matrix.constructor.Matrix.block_diagonal方法的典型用法代码示例。如果您正苦于以下问题:Python Matrix.block_diagonal方法的具体用法?Python Matrix.block_diagonal怎么用?Python Matrix.block_diagonal使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类sage.matrix.constructor.Matrix
的用法示例。
在下文中一共展示了Matrix.block_diagonal方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: p_adic_normal_form
# 需要导入模块: from sage.matrix.constructor import Matrix [as 别名]
# 或者: from sage.matrix.constructor.Matrix import block_diagonal [as 别名]
#.........这里部分代码省略.........
[-1 0 0 2]
sage: D, B = p_adic_normal_form(D4, 2)
sage: D
[ 2 1 0 0]
[ 1 2 0 0]
[ 0 0 2^2 2]
[ 0 0 2 2^2]
sage: D == B * D4 * B.T
True
sage: A4 = Matrix(ZZ, 4, [2, -1, 0, 0, -1, 2, -1, 0, 0, -1, 2, -1, 0, 0, -1, 2])
sage: A4
[ 2 -1 0 0]
[-1 2 -1 0]
[ 0 -1 2 -1]
[ 0 0 -1 2]
sage: D, B = p_adic_normal_form(A4, 2)
sage: D
[0 1 0 0]
[1 0 0 0]
[0 0 2 1]
[0 0 1 2]
We can handle degenerate forms::
sage: A4_extended = Matrix(ZZ, 5, [2, -1, 0, 0, -1, -1, 2, -1, 0, 0, 0, -1, 2, -1, 0, 0, 0, -1, 2, -1, -1, 0, 0, -1, 2])
sage: D, B = p_adic_normal_form(A4_extended, 5)
sage: D
[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 5 0]
[0 0 0 0 0]
and denominators::
sage: A4dual = A4.inverse()
sage: D, B = p_adic_normal_form(A4dual, 5)
sage: D
[5^-1 0 0 0]
[ 0 1 0 0]
[ 0 0 1 0]
[ 0 0 0 1]
TESTS::
sage: Z = Matrix(ZZ,0,[])
sage: p_adic_normal_form(Z, 3)
([], [])
sage: Z = matrix.zero(10)
sage: p_adic_normal_form(Z, 3)[0] == 0
True
"""
p = ZZ(p)
# input checks!!
G0, denom = G._clear_denom()
d = denom.valuation(p)
r = G0.rank()
if r != G0.ncols():
U = G0.hermite_form(transformation=True)[1]
else:
U = G0.parent().identity_matrix()
kernel = U[r:,:]
nondeg = U[:r,:]
# continue with the non-degenerate part
G = nondeg * G * nondeg.T * p**d
if precision == None:
# in Zp(2) we have to calculate at least mod 8 for things to make sense.
precision = G.det().valuation(p) + 4
R = Zp(p, prec = precision, type = 'fixed-mod')
G = G.change_ring(R)
G.set_immutable() # is not changed during computation
D = copy(G) # is transformed into jordan form
n = G.ncols()
# The trivial case
if n == 0:
return G.parent().zero(), G.parent().zero()
# the transformation matrix is called B
B = Matrix.identity(R, n)
if(p == 2):
D, B = _jordan_2_adic(G)
else:
D, B = _jordan_odd_adic(G)
D, B1 = _normalize(D)
B = B1 * B
# we have reached a normal form for p != 2
# for p == 2 extra work is necessary
if p==2:
D, B1 = _two_adic_normal_forms(D, partial=partial)
B = B1 * B
nondeg = B * nondeg
B = nondeg.stack(kernel)
D = Matrix.block_diagonal([D, Matrix.zero(kernel.nrows())])
if debug:
assert B.determinant().valuation() == 0 # B is invertible!
if p==2:
assert B*G*B.T == Matrix.block_diagonal(collect_small_blocks(D))
else:
assert B*G*B.T == Matrix.diagonal(D.diagonal())
return D/p**d, B