MajoranaOperator
class MajoranaOperator(coeffs, modes, boundaries)
Bases: object
Um operador de férmion de Majorana.
Definição
Esse operador é definido por uma combinação linear de produtos de operadores de Majorana [1], que podem ser definidos em termos dos operadores padrão de criação e aniquilação da segunda quantização fermiónica (ver também FermionOperator):
A propriedade fundamental de que um férmion de Majorana é sua própria antipartícula torna-se imediatamente evidente:
Isso resulta nas seguintes relações de anticomutação para os férmions de Majoran :
Isso faz com que a definição do operador completo seja a seguinte:
onde é o coeficiente (complexo) que constitui a combinação linear dos produtos de . O índice pode assumir qualquer valor entre 0 e o número de modos fermiónicos de Majorana sobre os quais o operador atua, menos 1.
implementação
Essa classe armazena os termos e coeficientes em vários vetores esparsos, de forma semelhante ao formato de linha esparsa compactada comumente utilizado para matrizes esparsas. Mais especificamente, um único operador contém 4 matrizes:
coeffs | Um vetor de coeficientes complexos composto por dois números de ponto flutuante de 64 bits. |
modes | Um vetor de inteiros de 32 bits que armazena os índices dos modos de Majorana sobre os quais a operação foi realizada. |
boundaries | Um vetor de números inteiros que indica os limites em modes. |
Os números inteiros no modes indexam os modos de Majorana, . Ao utilizar a função de conveniência gamma(), índices pares (ímpares) são usados para ( ).
É possível acessar cópias somente para leitura dessas matrizes internas por meio de seus respectivos métodos: get_coeffs(), get_modes(), e get_boundaries().
Essa estrutura de dados permite a construção e a manipulação de operadores de maneira muito eficiente. No entanto, isso significa que um operador pode conter termos duplicados a qualquer momento. Esses problemas devem ser resolvidos manualmente por meio do uso de simplify().
Construção
É possível construir um operador diretamente, fornecendo as matrizes descritas acima:
>>> from qiskit_fermions.operators import MajoranaOperator
>>> coeffs = [1.0, -2.0, 3.0j, -0.5j]
>>> modes = [0, 1, 0, 2, 0, 1, 2, 3]
>>> boundaries = [0, 0, 2, 4, 8]
>>> op = MajoranaOperator(coeffs, modes, boundaries)
>>> print(format(op))
1.000000e0 +0.000000e0j * ()
-2.000000e0 +0.000000e0j * (γ0 γ'0)
-0.000000e0-5.000000e-1j * (γ0 γ'0 γ1 γ'1)
0.000000e0 +3.000000e0j * (γ0 γ1)
Por uma questão de conveniência, é possível construir um operador a partir de um dicionário do tipo Python da seguinte maneira:
>>> from qiskit_fermions.operators import gamma
>>> op = MajoranaOperator.from_dict(
... {
... (): 1.0,
... (gamma(0, False), gamma(0, True)): -2.0,
... (gamma(0, False), gamma(1, False)): 3.0j,
... (gamma(0, False), gamma(0, True), gamma(1, False), gamma(1, True)): -0.5j,
... }
... )
>>> print(format(op))
1.000000e0 +0.000000e0j * ()
-2.000000e0 +0.000000e0j * (γ0 γ'0)
-0.000000e0-5.000000e-1j * (γ0 γ'0 γ1 γ'1)
0.000000e0 +3.000000e0j * (γ0 γ1)
Neste exemplo, utilizamos para gamma() criar os operadores de Majorana.
Além disso, estão disponíveis os seguintes métodos de construção e métodos auxiliares rápidos:
zero() | Constrói o operador de identidade aditiva. |
one() | Constrói o operador de identidade multiplicativa. |
from_terms(termos) | Cria um novo operador a partir de um iterador de termos (veja também iter_terms()). |
from_terms_with_groups(termos) | Cria um novo operador a partir de um iterador de termos com grupos (veja também iter_terms_with_groups()). |
Formatação
Nos exemplos acima, os operadores criados foram exibidos utilizando a saída de format(), o que resulta em uma forma legível para o usuário do operador.
>>> print(format(op))
1.000000e0 +0.000000e0j * ()
-2.000000e0 +0.000000e0j * (γ0 γ'0)
-0.000000e0-5.000000e-1j * (γ0 γ'0 γ1 γ'1)
0.000000e0 +3.000000e0j * (γ0 γ1)
A ordem de impressão de format(op) é explicitamente ordenada antes da impressão. Portanto, isso não reflete a ordem dos termos dentro do operador.
É possível obter uma forma alternativa a partir da função repr() , o que resulta em uma representação interpretável em Python. Em outras palavras, essa saída pode ser facilmente copiada e colada no shell do Python :
>>> print(repr(op))
MajoranaOperator.from_dict({...})
Por fim, para grandes operadores, esses dois resultados podem ser muito longos e indesejáveis. Então, é possível obter, por meio da função str() , um formulário bem simples com o mínimo de informações:
>>> print(str(op))
<MajoranaOperator with 4 terms>
Iteração
Como a estrutura de dados subjacente está implementada em Rust e possui um layout não trivial, não é possível iterar sobre ela diretamente:
>>> list(iter(op))
Traceback (most recent call last):
...
TypeError: 'qiskit_fermions.operators.majorana_operator.MajoranaOperator' object is not iterable
Em vez disso, essa classe fornece iteradores personalizados para atender a essa finalidade:
>>> list(sorted(op.iter_terms()))
[([], (1+0j)), ([0, 1], (-2+0j)), ([0, 1, 2, 3], (-0-0.5j)), ([0, 2], 3j)]
Para obter mais detalhes relevantes sobre a implementação.
A tabela abaixo lista todos os iteradores disponíveis:
iter_terms() | Um iterador sobre os termos do operador. |
iter_terms_with_groups() | Um iterador sobre os termos do operador, com seus respectivos índices de grupo. |
Aritmética
São suportadas as seguintes operações aritméticas:
Adição/Subtração
>>> op = MajoranaOperator.one()
>>> (op + op).simplify()
MajoranaOperator.from_dict({(): 2+0j})
>>> (op - op).simplify()
MajoranaOperator.from_dict({})
>>> op += op
>>> op.simplify()
MajoranaOperator.from_dict({(): 2+0j})
>>> op -= op
>>> op.simplify()
MajoranaOperator.from_dict({})
Multiplicação e divisão escalar
>>> op = MajoranaOperator.one()
>>> (2 * op).simplify()
MajoranaOperator.from_dict({(): 2+0j})
>>> (op / 2).simplify()
MajoranaOperator.from_dict({(): 0.5+0j})
>>> op *= 2
>>> op.simplify()
MajoranaOperator.from_dict({(): 2+0j})
>>> op /= 2
>>> op.simplify()
MajoranaOperator.from_dict({(): 1+0j})
Composição da equipe operacional
A composição de operadores corresponde à multiplicação pela esquerda: c = a & b corresponde a . Em outras palavras, a composição de dois operadores retorna um operador resultante que executa “primeiro a e depois ”. b
>>> op1 = MajoranaOperator.from_dict({(): 2.0, (gamma(0, False),): 3.0})
>>> op2 = MajoranaOperator.from_dict({(): 1.5, (gamma(0, True),): 4.0})
>>> comp = (op1 & op2).simplify()
>>> print(format(comp))
3.000000e0 +0.000000e0j * ()
4.500000e0 +0.000000e0j * (γ0)
8.000000e0 +0.000000e0j * (γ'0)
1.200000e1 +0.000000e0j * (γ'0 γ0)
>>> op2 &= op1
>>> print(format(op2.simplify()))
3.000000e0 +0.000000e0j * ()
4.500000e0 +0.000000e0j * (γ0)
1.200000e1 +0.000000e0j * (γ0 γ'0)
8.000000e0 +0.000000e0j * (γ'0)
>>> squared = (op1 ** 2).simplify()
>>> print(format(squared))
4.000000e0 +0.000000e0j * ()
1.200000e1 +0.000000e0j * (γ0)
9.000000e0 +0.000000e0j * (γ0 γ0)
Por conveniência, a multiplicação pela direita é implementada por c = a @ b (o que resulta em ).
>>> (op1 @ op2).equiv(op2 & op1)
True
Outras Operações
Além dos métodos mágicos correspondentes às operações aritméticas descritas acima, estão disponíveis os seguintes métodos:
adjoint() | Retorna o conjugado hermitiano (ou adjunto) desse operador. |
ichop( [atol] ) | Remove termos cuja magnitude do coeficiente seja inferior ao limite especificado. |
simplify( [atol] ) | Retorna um operador equivalente, porém simplificado. |
normal_ordered( [ascendente, reduzir] ) | Retorna um operador equivalente com termos ordenados normalmente. |
relabel_modes(permutação) | Retorna um novo operador com os modos renomeados. |
Propriedades
Por fim, existem vários métodos para verificar determinadas propriedades de um operador:
is_hermitian( [atol] ) | Retorna se este operador é hermitiano. |
max_rank() | Retorna o grau máximo dos termos neste operador. |
is_even() | Retorna se este operador é par. |
[ 1 ]
https://en.wikipedia.org/wiki/Majorana _fermion
Atributos
groups
Um vetor opcional de índices de grupo para cada termo.
Para obter mais informações, consulte o módulo grouping .
Métodos
adjoint
adjoint()
Retorna o conjugado hermitiano (ou adjunto) desse operador.
Isso afeta os termos e coeficientes da seguinte forma:
- as ações em cada termo invertem sua ordem
- os coeficientes são conjugados complexos
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): -1.0j, (gamma(0, False), gamma(0, True)): 1.0})
>>> adj = op.adjoint()
>>> print(format(adj))
-0.000000e0 +1.000000e0j * ()
1.000000e0 -0.000000e0j * (γ'0 γ0)
equiv
equiv(other, atol=1e-08)
Verifica se este operador é equivalente a outro operador.
Equivalência, neste contexto, significa igualdade aproximada dentro da tolerância absoluta especificada. Para ser mais preciso, esse método retorna True, quando todos os valores absolutos dos coeficientes da diferença other - self estão abaixo do limite especificado atol.
Essa é a comparação matemática que você quase sempre deseja. Ele difere do operador == , que verifica a igualdade exata dos termos armazenados (seus coeficientes, modos e limites internos dos termos), sem tolerância e sem simplificação. Dois operadores matematicamente iguais podem, portanto, apresentar resultados diferentes na comparação == se forem armazenados de maneira diferente — por exemplo, um não simplificado em a + a comparação com um 2 * a, ou termos organizados em uma ordem diferente. Use equiv para comparar operadores dentro de uma tolerância numérica.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 1e-7})
>>> zero = MajoranaOperator.zero()
>>> op.equiv(zero)
False
>>> op.equiv(zero, 1e-6)
True
>>> op.equiv(zero, 1e-9)
False
Parâmetros
- outro – o outro operador com o qual se deve comparar.
- atol – a tolerância absoluta para a comparação. Esse valor é definido por padrão como
1e-8.
from_dict
classmethod from_dict(data)
Cria um novo operador a partir de um dicionário.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict(
... {
... (): 1.0-1.0j,
... (0, 1): 2.0,
... }
... )
>>> print(format(op))
1.000000e0 -1.000000e0j * ()
2.000000e0 +0.000000e0j * (γ0 γ'0)
Parâmetros
dados – um dicionário que mapeia tuplas de termos para coeficientes complexos. Cada chave é uma tupla de números inteiros que indexam os modos de Majorana. Você pode usar gamma() para simplificar a atribuição de índices pares e ímpares a e .
Retorna
Uma nova operadora.
from_terms
classmethod from_terms(terms)
Cria um novo operador a partir de um iterador de termos (veja também iter_terms()).
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 2.0, (0,): 1.0, (1,): -1.0j})
>>> op.equiv(MajoranaOperator.from_terms(op.iter_terms()))
True
Parâmetros
termos – um iterador de termos, conforme gerado por iter_terms().
Retorna
Uma nova operadora.
from_terms_with_groups
classmethod from_terms_with_groups(terms)
Cria um novo operador a partir de um iterador de termos com grupos (veja também iter_terms_with_groups()).
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator([2.0, 1.0, -1.0j], [0, 1], [0, 0, 1, 2])
>>> op.groups = [0, 1, 1]
>>> reconstructed = MajoranaOperator.from_terms_with_groups(op.iter_terms_with_groups())
>>> op.equiv(reconstructed) and op.groups == reconstructed.groups
True
Parâmetros
termos – um iterador de termos, conforme gerado por iter_terms_with_groups().
Retorna
Uma nova operadora.
get_boundaries
get_boundaries()
Retorna uma lista somente para leitura dos índices que indicam os limites entre os termos do operador.
Este método retorna uma cópia dos dados internos.
A explicação sobre a estrutura interna dos dados está aqui.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.one()
>>> op += MajoranaOperator.from_dict({(0, 1): 1.0})
>>> op.get_boundaries()
[0, 0, 2]
Retorna
Uma lista dos limites dos termos do operador.
get_coeffs
get_coeffs()
Retorna uma lista somente para leitura dos coeficientes do operador.
Este método retorna uma cópia dos dados internos.
A explicação sobre a estrutura interna dos dados está aqui.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.one()
>>> op += -1j * MajoranaOperator.one()
>>> op.get_coeffs()
[(1+0j), -1j]
Retorna
Uma lista dos coeficientes do operador.
get_modes
get_modes()
Retorna uma lista somente para leitura dos índices de modo sobre os quais o operador atuou.
Este método retorna uma cópia dos dados internos.
A explicação sobre a estrutura interna dos dados está aqui.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.one()
>>> op += MajoranaOperator.from_dict({(0, 1): 1.0})
>>> op.get_modes()
[0, 1]
Retorna
Uma lista dos modos de operação.
get_support
get_support()
Retorna o conjunto de índices de modo sobre os quais este operador atua.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict(
... {
... (0, 4): 1,
... (1, 3, 4, 7): 1,
... }
... )
>>> assert op.get_support() == {0, 1, 3, 4, 7}
Retorna
O conjunto de índices de modo sobre os quais esse operador atua.
group_weights
group_weights()
Retorna a magnitude média absoluta do coeficiente de cada grupo.
A i-ésima entrada é a soma de abs(coeff) sobre os termos do grupo i, dividida pelo número de termos desse grupo. Se for groups None, essa função também retorna None.
Este é o peso amostral de uma fórmula de produto aleatória (por exemplo, qDRIFT ) que seleciona grupos inteiros, em vez de termos individuais. Calcular isso de forma nativa é consideravelmente mais econômico do que reduzir e get_coeffs() groups em NumPy,, pois esses dois acessadores copiam, cada um, um valor por termo não agrupado do operador apenas para que ele seja agregado novamente a um valor por grupo, enquanto esta abordagem retorna apenas os valores num_groups() reduzidos.
Um índice de grupo que nenhum termo possui tem peso 0.0, o que o exclui da amostra.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator(
... [1.0, 2.0, -1.0, -2.0],
... [0, 1, 2, 3, 1, 0, 3, 2],
... [0, 2, 4, 6, 8],
... )
>>> print(op.group_weights())
None
>>> op.groups = [0, 1, 0, 1]
>>> op.group_weights()
[1.0, 2.0]
Retorna
A magnitude média absoluta do coeficiente de cada índice do grupo.
has_groups
has_groups()
Retorna se este operador rastreia índices de grupo.
Isso equivale a (mas é mais barato do que) verificar op.groups is not None, pois não copia os índices dos grupos do operador para inspecioná-los.
Isso retorna True mesmo quando groups é uma lista vazia, que é o estado de um operador agrupado que não contém termos.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator(
... [1.0, 2.0, -1.0, -2.0],
... [0, 1, 2, 3, 1, 0, 3, 2],
... [0, 2, 4, 6, 8],
... )
>>> op.has_groups()
False
>>> op.groups = [0, 1, 0, 1]
>>> op.has_groups()
True
Retorna
Se groups está definido para esse operador.
ichop
ichop(atol=1e-08)
Remove termos cuja magnitude do coeficiente seja inferior ao limite especificado.
Esse método modifica o operador no próprio local e retorna None.
Esse método trunca os coeficientes de forma avarenta! Se o operador sobre o qual a operação é realizada puder conter coeficientes distintos para termos duplicados, considere chamar simplify() em vez disso!
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 1e-4, (0,): 1e-6, (1,): 1e-10})
>>> print(format(op))
1.000000e-4 +0.000000e0j * ()
1.000000e-6 +0.000000e0j * (γ0)
1.000000e-10 +0.000000e0j * (γ'0)
>>> op.ichop()
>>> print(format(op))
1.000000e-4 +0.000000e0j * ()
1.000000e-6 +0.000000e0j * (γ0)
>>> op.ichop(1e-5)
>>> print(format(op))
1.000000e-4 +0.000000e0j * ()
Parâmetros
atol – a tolerância absoluta para o limite de corte. Esse valor é definido por padrão como 1e-8.
is_even
is_even()
Retorna se este operador é par.
Um operador é considerado par mesmo quando todos os seus termos contêm um número par de ações.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(0, 1): 1})
>>> op.is_even()
True
>>> op = MajoranaOperator.from_dict({(0,): 1})
>>> op.is_even()
False
Retorna
Se esse operador é par.
is_hermitian
is_hermitian(atol=1e-08)
Retorna se este operador é hermitiano.
Essa verificação é implementada equiv() utilizando a diferença normal_ordered() entre self e seus e adjoint() zero().
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({
... (0, 1, 2, 3): 1.00001j,
... (3, 2, 1, 0): -1j,
... })
>>> op.is_hermitian()
False
>>> op.is_hermitian(1e-4)
True
Parâmetros
atol – A precisão numérica até a qual os coeficientes são considerados iguais. Esse valor é definido por padrão como 1e-8.
Retorna
Se esse operador é hermitiano.
iter_terms
iter_terms()
Um iterador sobre os termos do operador.
A modificação dos itens da iteração não afeta os dados do operador subjacente.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 2.0, (0,): 1.0, (1,): -1.0j})
>>> list(sorted(op.iter_terms()))
[([], (2+0j)), ([0], (1+0j)), ([1], (-0-1j))]
iter_terms_with_groups
iter_terms_with_groups()
Um iterador sobre os termos do operador, acompanhado de seus respectivos índices de grupo.
A modificação dos itens da iteração não afeta os dados do operador subjacente.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator([2.0, 1.0, -1.0j], [0, 1], [0, 0, 1, 2])
>>> op.groups = [0, 1, 1]
>>> list(op.iter_terms_with_groups())
[([], (2+0j), 0), ([0], (1+0j), 1), ([1], (-0-1j), 1)]
max_rank
max_rank()
Retorna o grau máximo dos termos neste operador.
O comprimento do termo mais longo pode depender da forma do operador, o que significa que (por exemplo) a simplificação do operador ou a ordenação normal podem resultar em um grau máximo diferente.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(0, 1, 2, 3): 1})
>>> op.max_rank()
4
Retorna
A potência máxima desse operador.
normal_ordered
normal_ordered(ascending=False, reduce=True)
Retorna um operador equivalente com termos ordenados normalmente.
A ordem normal de um termo de operador é definida de forma que todas as ações sejam ordenadas lexicalmente. O fato de subirem ou descerem depende do valor do parâmetro ascending . De acordo com a convenção estabelecida por gamma() para colocar ( ) em índices pares (ímpares), isso resulta no seguinte exemplo (para o padrão, ascending=False): [\gamma(1, True), \gamma(1, False), \gamma(0, True), \gamma(0, False)] = [3, 2, 1, 0].
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(gamma(0, False), gamma(0, True), gamma(0, False)): 1})
>>> print(format(op.normal_ordered(reduce=False)))
-1.000000e0 +0.000000e0j * (γ'0 γ0 γ0)
>>> print(format(op.normal_ordered(reduce=True)))
-1.000000e0 +0.000000e0j * (γ'0)
Parâmetros
- ascendente – se os índices devem subir ou descer.
- reduzir – se se deve reduzir cada termo à sua forma mínima, eliminando as ações que, ao quadrado, resultam na identidade. Veja também o exemplo acima.
Retorna
Um operador equivalente, porém de ordem normal.
num_groups
num_groups()
Retorna o número de grupos.
Se for groups None, essa função também retorna None. Caso contrário, ela retornará o número de grupos, que é definido como o maior índice de grupo encontrado mais 1 (o que, portanto, pode ser usado como o índice do próximo grupo).
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator(
... [1.0, 2.0, -1.0, -2.0],
... [0, 1, 2, 3, 1, 0, 3, 2],
... [0, 2, 4, 6, 8],
... )
>>> op.groups = [0, 1, 0, 1]
>>> op.num_groups()
2
Retorna
O maior índice do grupo está em alta groups de 1.
one
classmethod one()
Constrói o operador de identidade multiplicativa.
A composição do operador construído por esse método com outro operador não produz nenhum efeito.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 2.0})
>>> one = MajoranaOperator.one()
>>> op & one == op
True
relabel_modes
relabel_modes(permutation)
Retorna um novo operador com os modos renomeados.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({
... (0, 1): 1,
... (0, 1, 2, 3): 1,
... })
>>> permutation = [5, 6, 4, 3]
>>> relabeled = op.relabel_modes(permutation)
>>> print(format(relabeled))
1.000000e0 +0.000000e0j * (γ'2 γ3)
1.000000e0 +0.000000e0j * (γ'2 γ3 γ2 γ'1)
Parâmetros
permutação – a lista de permutações de índices. O modo é i renomeado para permutation[i], portanto, a lista não deve conter entradas duplicadas e deve ter comprimento suficiente para indexar todos os modos sobre os quais o operador atua (seu comprimento deve ser maior que o maior índice de modo do operador).
Retorna
Um novo operador com seus modos renomeados.
Aumentos
ValueError – se contiver permutation entradas duplicadas ou for curto demais para renomear algum modo sobre o qual o operador atua.
simplify
simplify(atol=1e-08)
Retorna um operador equivalente, porém simplificado.
O processo de simplificação soma, primeiro, todos os coeficientes que pertencem a termos iguais e, em seguida, retém apenas aqueles cujo coeficiente total exceda a tolerância especificada (exatamente como ichop()).
Quando um operador tiver sido manipulado aritmeticamente ou construído de forma que não garanta a unicidade dos termos, esse método deve ser chamado antes da aplicação de qualquer método que filtre coeficientes numericamente pequenos, a fim de evitar a perda de informação. Veja o exemplo abaixo, que mostra como ichop() pode truncar termos cuja soma resulta em um coeficiente de magnitude total que não deveria ser truncado:
>>> from qiskit_fermions.operators import MajoranaOperator
>>> coeffs = [1e-5] * int(1e5)
>>> boundaries = [0] + [0] * int(1e5)
>>> op = MajoranaOperator(coeffs, [], boundaries)
>>> canon = op.simplify(1e-4)
>>> assert canon.equiv(op.one(), 1e-6)
>>> op.ichop(1e-4)
>>> assert op.equiv(op.zero(), 1e-6)
Parâmetros
atol – a tolerância absoluta para o limite de corte. Esse valor é definido por padrão como 1e-8.
Retorna
Um operador equivalente, porém simplificado.
split_out_groups
split_out_groups(group_indices=None)
Divide esse operador em uma lista opcional de novos operadores com base em groups.
Se for groups None, essa função também retorna None. Caso contrário, se for group_indices None (valor padrão), ela retorna uma lista contendo um novo operador para cada índice de grupo em groups, na ordem dos índices. Se group_indices for fornecido, apenas os índices solicitados são construídos, na ordem indicada: isso evita o custo de construir operadores para grupos que nunca serão utilizados, o que é especialmente benéfico quando é necessário apenas um pequeno número de grupos dentre um total muito maior, por exemplo, ao realizar uma subamostragem de grupos para uma fórmula de produto aleatória. Um índice duplicado em group_indices é retornado uma vez por ocorrência.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator(
... [1.0, 2.0, -1.0, -2.0],
... [0, 1, 2, 3, 1, 0, 3, 2],
... [0, 2, 4, 6, 8],
... )
>>> print(op.split_out_groups())
None
>>> op.groups = [0, 1, 0, 1]
>>> groups = op.split_out_groups()
>>> for g in groups:
... print(list(sorted(g.iter_terms())))
[([0, 1], (1+0j)), ([1, 0], (-1+0j))]
[([2, 3], (2+0j)), ([3, 2], (-2+0j))]
>>> groups = op.split_out_groups(group_indices=[1])
>>> for g in groups:
... print(list(sorted(g.iter_terms())))
[([2, 3], (2+0j)), ([3, 2], (-2+0j))]
Parâmetros
group_indices – os índices de grupo para os quais serão criados os operadores, na ordem de saída desejada. Quando omitido, todos os grupos são criados, em ordem de índice.
Retorna
Um vetor opcional contendo um novo operador para cada índice de grupo solicitado.
zero
classmethod zero()
Constrói o operador de identidade aditiva.
Adicionar o operador criado por esse método a outro não produz nenhum efeito.
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 2.0})
>>> zero = MajoranaOperator.zero()
>>> op + zero == op
True
Métodos do protocolo
_anti_commutator_
static _anti_commutator_(op_a, op_b)
_commutator_
static _commutator_(op_a, op_b)
_double_commutator_
static _double_commutator_(op_a, op_b, op_c, sign)
_fermion_operator_
_fermion_operator_()
Converte esse operador em um FermionOperator.
Isso implementa o protocolo SupportsFermionOperator por meio da delegação a majorana_to_fermion().