code: def paulis_commute(element0: Pauli, element1: Pauli) -> bool:
      
  
      def _coincident_parity(term0: PauliTerm, term1: PauliTerm) -> bool:
          non_similar = 0
          key = itemgetter(0)
  
          op0 = term0[0]
          op1 = term1[0]
          for _, qops in groupby(heapq.merge(op0, op1, key=key), key=key):
  
              listqops = list(qops)
              if len(listqops) == 2 and listqops[0][1] != listqops[1][1]:
                  non_similar += 1
          return non_similar % 2 == 0
  
      for term0, term1 in product(element0, element1):
          if not _coincident_parity(term0, term1):
              return False
  
      return True
docs: Return true if the two elements of the Pauli algebra commute.
      i.e. if element0 * element1 == element1 * element0
  
      Derivation similar to arXiv:1405.5749v2 for the check_commutation step in
      the Raesi, Wiebe, Sanders algorithm (arXiv:1108.4318, 2011).