code: def _raw_mul(self, plaintext):
          
          if not isinstance(plaintext, int):
              raise TypeError('Expected ciphertext to be int, not %s' %
                  type(plaintext))
  
          if plaintext < 0 or plaintext >= self.public_key.n:
              raise ValueError('Scalar out of bounds: %i' % plaintext)
  
          if self.public_key.n - self.public_key.max_int <= plaintext:
              # Very large plaintext, play a sneaky trick using inverses
              neg_c = invert(self.ciphertext(False), self.public_key.nsquare)
              neg_scalar = self.public_key.n - plaintext
              return powmod(neg_c, neg_scalar, self.public_key.nsquare)
          else:
              return powmod(self.ciphertext(False), plaintext, self.public_key.nsquare)
docs: Returns the integer E(a * plaintext), where E(a) = ciphertext
  
          Args:
            plaintext (int): number by which to multiply the
              `EncryptedNumber`. *plaintext* is typically an encoding.
              0 <= *plaintext* < :attr:`~PaillierPublicKey.n`
  
          Returns:
            int: Encryption of the product of `self` and the scalar
              encoded in *plaintext*.
  
          Raises:
            TypeError: if *plaintext* is not an int.
            ValueError: if *plaintext* is not between 0 and
              :attr:`PaillierPublicKey.n`.