mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-08 19:44:57 -05:00
3.4 KiB
3.4 KiB
Arithmetic Operations
In this tutorial, we are going to go over all arithmetic operations available in concrete. Please read Compiling and Executing before reading further to see how you can compile the functions below.
Addition
Static ClearScalar and EncryptedScalar
def f(x):
return x + 42
or
def f(x):
return 42 + x
where
x = EncryptedScalar(UnsignedInteger(bits))
results in
engine.run(3) == 45
engine.run(0) == 42
Dynamic ClearScalar and EncryptedScalar
def f(x, y):
return x + y
or
def f(x, y):
return y + x
results in
engine.run(6, 4) == 10
engine.run(1, 1) == 2
where
x = EncryptedScalar(UnsignedInteger(bits))y = ClearScalar(UnsignedInteger(bits))
EncryptedScalar and EncryptedScalar
def f(x, y):
return x + y
where
x = EncryptedScalar(UnsignedInteger(bits))y = EncryptedScalar(UnsignedInteger(bits))
results in
engine.run(7, 7) == 14
engine.run(3, 4) == 7
Subtraction
Static ClearScalar and EncryptedScalar
def f(x):
return 3 - x
where
x = EncryptedScalar(UnsignedInteger(bits))
results in
engine.run(2) == 1
engine.run(3) == 0
Dynamic ClearScalar and EncryptedScalar
def f(x, y):
return y - x
where
x = EncryptedScalar(UnsignedInteger(bits))y = ClearScalar(UnsignedInteger(bits))
results in
engine.run(2, 4) == 2
engine.run(1, 7) == 6
Multiplication
Static ClearScalar and EncryptedScalar
def f(x):
return x * 2
or
def f(x):
return 2 * x
where
x = EncryptedScalar(UnsignedInteger(bits))
results in
engine.run(2) == 4
engine.run(5) == 10
Dynamic ClearScalar and EncryptedScalar
def f(x, y):
return x * y
or
def f(x, y):
return y * x
where
x = EncryptedScalar(UnsignedInteger(bits))y = ClearScalar(UnsignedInteger(bits))
results in
engine.run(2, 3) == 6
engine.run(1, 7) == 7
Dot Product
Dynamic ClearTensor and EncryptedTensor
def f(x, y):
return np.dot(x, y)
or
def f(x, y):
return np.dot(y, x)
where
x = EncryptedTensor(UnsignedInteger(bits), shape=(2,))y = ClearTensor(UnsignedInteger(bits), shape=(2,))
results in
engine.run([1, 1], [2, 3]) == 5
engine.run([2, 3], [2, 3]) == 13
Combining all together
def f(x, y, z):
return 100 - (2 * (np.dot(x, y) + z))
where
x = EncryptedTensor(UnsignedInteger(bits), shape=(2,))y = ClearTensor(UnsignedInteger(bits), shape=(2,))z = EncryptedScalar(UnsignedInteger(bits))
results in
engine.run([1, 2], [4, 3], 10) == 60
engine.run([2, 3], [3, 2], 5) == 66