From b92a70768df1edaf3597fcd4dafac8ae3c965c30 Mon Sep 17 00:00:00 2001 From: Umut Date: Wed, 15 Sep 2021 12:06:18 +0300 Subject: [PATCH] doc: write arithmetic operations tutorial --- docs/user/tutorial/ARITHMETIC_OPERATIONS.md | 214 +++++++++++++++++++- 1 file changed, 213 insertions(+), 1 deletion(-) diff --git a/docs/user/tutorial/ARITHMETIC_OPERATIONS.md b/docs/user/tutorial/ARITHMETIC_OPERATIONS.md index 710b9fbf7..f9368ff60 100644 --- a/docs/user/tutorial/ARITHMETIC_OPERATIONS.md +++ b/docs/user/tutorial/ARITHMETIC_OPERATIONS.md @@ -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 +```