mirror of
https://github.com/zama-ai/concrete.git
synced 2026-02-08 19:44:57 -05:00
doc: write arithmetic operations tutorial
This commit is contained in:
@@ -1,3 +1,215 @@
|
||||
# Arithmetic Operations
|
||||
|
||||
Umut to do: #312
|
||||
In this tutorial, we are going to go over all arithmetic operations available in `concretefhe`. Please read [Compiling and Executing](../howto/COMPILING_AND_EXECUTING.md) before reading further to see how you can compile the functions below.
|
||||
|
||||
## Addition
|
||||
|
||||
### Static ClearScalar and EncryptedScalar
|
||||
|
||||
```python
|
||||
def f(x):
|
||||
return x + 42
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```python
|
||||
def f(x):
|
||||
return 42 + x
|
||||
```
|
||||
|
||||
where
|
||||
|
||||
- `x = EncryptedScalar(UnsignedInteger(bits))`
|
||||
|
||||
results in
|
||||
|
||||
```python
|
||||
engine.run(3) == 45
|
||||
engine.run(0) == 42
|
||||
```
|
||||
|
||||
### Dynamic ClearScalar and EncryptedScalar
|
||||
|
||||
```python
|
||||
def f(x, y):
|
||||
return x + y
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```python
|
||||
def f(x, y):
|
||||
return y + x
|
||||
```
|
||||
|
||||
results in
|
||||
|
||||
```python
|
||||
engine.run(6, 4) == 10
|
||||
engine.run(1, 1) == 2
|
||||
```
|
||||
|
||||
where
|
||||
|
||||
- `x = EncryptedScalar(UnsignedInteger(bits))`
|
||||
- `y = ClearScalar(UnsignedInteger(bits))`
|
||||
|
||||
### EncryptedScalar and EncryptedScalar
|
||||
|
||||
```python
|
||||
def f(x, y):
|
||||
return x + y
|
||||
```
|
||||
|
||||
where
|
||||
|
||||
- `x = EncryptedScalar(UnsignedInteger(bits))`
|
||||
- `y = EncryptedScalar(UnsignedInteger(bits))`
|
||||
|
||||
results in
|
||||
|
||||
```python
|
||||
engine.run(7, 7) == 14
|
||||
engine.run(3, 4) == 7
|
||||
```
|
||||
|
||||
## Subtraction
|
||||
|
||||
### Static ClearScalar and EncryptedScalar
|
||||
|
||||
```python
|
||||
def f(x):
|
||||
return 3 - x
|
||||
```
|
||||
|
||||
where
|
||||
|
||||
- `x = EncryptedScalar(UnsignedInteger(bits))`
|
||||
|
||||
results in
|
||||
|
||||
```python
|
||||
engine.run(2) == 1
|
||||
engine.run(3) == 0
|
||||
```
|
||||
|
||||
### Dynamic ClearScalar and EncryptedScalar
|
||||
|
||||
```python
|
||||
def f(x, y):
|
||||
return y - x
|
||||
```
|
||||
|
||||
where
|
||||
|
||||
- `x = EncryptedScalar(UnsignedInteger(bits))`
|
||||
- `y = ClearScalar(UnsignedInteger(bits))`
|
||||
|
||||
results in
|
||||
|
||||
```python
|
||||
engine.run(2, 4) == 2
|
||||
engine.run(1, 7) == 6
|
||||
```
|
||||
|
||||
## Multiplication
|
||||
|
||||
### Static ClearScalar and EncryptedScalar
|
||||
|
||||
```python
|
||||
def f(x):
|
||||
return x * 2
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```python
|
||||
def f(x):
|
||||
return 2 * x
|
||||
```
|
||||
|
||||
where
|
||||
|
||||
- `x = EncryptedScalar(UnsignedInteger(bits))`
|
||||
|
||||
results in
|
||||
|
||||
```python
|
||||
engine.run(2) == 4
|
||||
engine.run(5) == 10
|
||||
```
|
||||
|
||||
### Dynamic ClearScalar and EncryptedScalar
|
||||
|
||||
```python
|
||||
def f(x, y):
|
||||
return x * y
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```python
|
||||
def f(x, y):
|
||||
return y * x
|
||||
```
|
||||
|
||||
where
|
||||
|
||||
- `x = EncryptedScalar(UnsignedInteger(bits))`
|
||||
- `y = ClearScalar(UnsignedInteger(bits))`
|
||||
|
||||
results in
|
||||
|
||||
```python
|
||||
engine.run(2, 3) == 6
|
||||
engine.run(1, 7) == 7
|
||||
```
|
||||
|
||||
## Dot Product
|
||||
|
||||
### Dynamic ClearTensor and EncryptedTensor
|
||||
|
||||
```python
|
||||
def f(x, y):
|
||||
return np.dot(x, y)
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```python
|
||||
def f(x, y):
|
||||
return np.dot(y, x)
|
||||
```
|
||||
|
||||
where
|
||||
|
||||
- `x = EncryptedTensor(UnsignedInteger(bits), shape=(2,))`
|
||||
- `y = ClearTensor(UnsignedInteger(bits), shape=(2,))`
|
||||
|
||||
results in
|
||||
|
||||
```python
|
||||
engine.run([1, 1], [2, 3]) == 5
|
||||
engine.run([2, 3], [2, 3]) == 13
|
||||
```
|
||||
|
||||
## Combining all together
|
||||
|
||||
```python
|
||||
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
|
||||
|
||||
```python
|
||||
engine.run([1, 2], [4, 3], 10) == 60
|
||||
engine.run([2, 3], [3, 2], 5) == 66
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user