ComputeFHE 1.0
General-Purpose Privacy-Preserving Computation Library for TFHE
Loading...
Searching...
No Matches
ALUStandard.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 Faris Serdar Taşel <fst@cankaya.edu.tr>
3 * SPDX-FileCopyrightText: 2026 Efe Çiftci <efeciftci@cankaya.edu.tr>
4 *
5 * SPDX-License-Identifier: MIT
6 */
7
14#pragma once
15#include <computefhe/BaseALU.h>
16
17namespace computefhe {
18
26 class ALUStandard : virtual public BaseALU {
27 public:
29
30 // Logic Gates
31 virtual BinaryDigit Gate_MAJ(const BinaryDigit &a, const BinaryDigit &b,
32 const BinaryDigit &c);
34 const BinaryDigit &b,
35 const BinaryDigit &c);
37 const BinaryDigit &a,
38 const BinaryDigit &b,
39 BinaryDigit *carry_out = nullptr);
41 const BinaryDigit &e0,
42 const BinaryDigit &s0);
43
44 // Interface
45 virtual FixedPoint Mux(const BinaryDigit &s, const FixedPoint &a,
46 const FixedPoint &b);
47 virtual FixedPoint ToggleMSB(const FixedPoint &a);
48
49 virtual FixedPoint ShiftLeft(const FixedPoint &a, size_t shift);
50 virtual FixedPoint ShiftRight(const FixedPoint &a, size_t shift,
51 bool is_arithmetic = false);
52
53 virtual void Swap_if(const BinaryDigit &cond, BinaryDigit &a,
54 BinaryDigit &b);
55 virtual void Swap_if(const BinaryDigit &cond, FixedPoint &a,
56 FixedPoint &b);
57
58 virtual void HalfAdder(const BinaryDigit &a, const BinaryDigit &b,
59 BinaryDigit &sum, BinaryDigit &carry_out);
60 virtual void HalfSubtractor(const BinaryDigit &a, const BinaryDigit &b,
61 BinaryDigit &sum, BinaryDigit &carry_out);
62 virtual void FullAdder(const BinaryDigit &a, const BinaryDigit &b,
63 const BinaryDigit &c, BinaryDigit &sum,
64 BinaryDigit &carry_out);
65
66 virtual FixedPoint Add(const FixedPoint &a, const FixedPoint &b);
67 virtual FixedPoint AddC(const FixedPoint &a, const FixedPoint &b);
68 virtual FixedPoint AddNC(const FixedPoint &a, const FixedPoint &b);
69 virtual FixedPoint AddCNC(const FixedPoint &a, const FixedPoint &b);
70 virtual FixedPoint Sub(const FixedPoint &a, const FixedPoint &b);
71 virtual FixedPoint SubC(const FixedPoint &a, const FixedPoint &b);
72 virtual FixedPoint SubNC(const FixedPoint &a, const FixedPoint &b);
73 virtual FixedPoint SubCNC(const FixedPoint &a, const FixedPoint &b);
74 virtual FixedPoint Neg(const FixedPoint &a);
75 virtual FixedPoint Not(const FixedPoint &a);
76 virtual BinaryDigit CmpNotEq(const FixedPoint &a, const FixedPoint &b);
77 virtual BinaryDigit CmpEq(const FixedPoint &a, const FixedPoint &b);
78 virtual BinaryDigit CmpLTEq_U(const FixedPoint &a, const FixedPoint &b);
79 virtual BinaryDigit CmpGT_U(const FixedPoint &a, const FixedPoint &b);
80 virtual BinaryDigit CmpGTEq_U(const FixedPoint &a, const FixedPoint &b);
81 virtual BinaryDigit CmpLT_U(const FixedPoint &a, const FixedPoint &b);
82 virtual BinaryDigit CmpLTEq(const FixedPoint &a, const FixedPoint &b);
83 virtual BinaryDigit CmpGT(const FixedPoint &a, const FixedPoint &b);
84 virtual BinaryDigit CmpGTEq(const FixedPoint &a, const FixedPoint &b);
85 virtual BinaryDigit CmpLT(const FixedPoint &a, const FixedPoint &b);
86 virtual FixedPoint FullMul(const FixedPoint &a, const FixedPoint &b);
87 virtual FixedPoint Mul(const FixedPoint &a, const FixedPoint &b);
88 virtual void DivU(const FixedPoint &a, const FixedPoint &b,
89 FixedPoint &q, FixedPoint &r);
90
91 virtual FixedPoint PAdd(const FixedPoint &a, const FixedPoint &pb);
92 virtual FixedPoint PAddC(const FixedPoint &a, const FixedPoint &pb);
93 virtual FixedPoint PAddNC(const FixedPoint &a, const FixedPoint &pb);
94 virtual FixedPoint PAddCNC(const FixedPoint &a, const FixedPoint &pb);
95 virtual FixedPoint PSub(const FixedPoint &pa, const FixedPoint &b);
96 virtual FixedPoint PSubC(const FixedPoint &pa, const FixedPoint &b);
97 virtual FixedPoint PSubNC(const FixedPoint &pa, const FixedPoint &b);
98 virtual FixedPoint PSubCNC(const FixedPoint &pa, const FixedPoint &b);
99 virtual FixedPoint CPSub(const FixedPoint &a, const FixedPoint &pb);
100 virtual FixedPoint CPSubC(const FixedPoint &a, const FixedPoint &pb);
101 virtual FixedPoint CPSubNC(const FixedPoint &a, const FixedPoint &pb);
102 virtual FixedPoint CPSubCNC(const FixedPoint &a, const FixedPoint &pb);
103 virtual FixedPoint PFullMul(const FixedPoint &a, const FixedPoint &pb);
105 const FixedPoint &pb);
107 const FixedPoint &pb);
108 virtual FixedPoint PMul(const FixedPoint &a, const FixedPoint &pb);
109 virtual FixedPoint PMulFast(const FixedPoint &a, const FixedPoint &pb);
110
111 virtual uint Get_CtCtAdd_Cost(size_t n_bits);
112 virtual uint Get_CtCtAddNC_Cost(size_t n_bits);
113 virtual uint Get_CtCtSubC_Cost(size_t n_bits);
114 virtual uint Get_CtCtSubNC_Cost(size_t n_bits);
115 virtual uint Get_CtPtAddC_Cost(size_t n_bits);
116 virtual uint Get_PtCtSub_Cost(size_t n_bits);
117 virtual uint Get_CtPtSubCNC_Cost(size_t n_bits);
118 virtual uint Get_CtNeg_Cost(size_t n_bits);
119 virtual uint Get_PtFullMul_Cost(const FixedPoint &pt, size_t ct_n_bits,
120 size_t &out_n_bits);
121 virtual uint Get_Pt2sCompFullMul_Cost(const FixedPoint &pt,
122 size_t ct_n_bits);
123 virtual uint Get_PtMul_Cost(const FixedPoint &pt);
124 virtual uint Get_Pt2sCompMul_Cost(const FixedPoint &pt);
125 virtual uint Get_BoothsMul_Cost(const FixedPoint &pt, size_t ct_n_bits);
126 };
127} // namespace computefhe
Defines the abstract base class for FHE-based Arithmetic Logic Units.
Standard ALU implementation using fundamental FHE logic gates.
Definition ALUStandard.h:26
virtual FixedPoint PMulFast(const FixedPoint &a, const FixedPoint &pb)
Optimized standard multiplication by a plaintext constant.
virtual BinaryDigit Gate_DigitSum(const BinaryDigit &e1, const BinaryDigit &e0, const BinaryDigit &s0)
Performs bitwise digit summation logic.
virtual FixedPoint Mul(const FixedPoint &a, const FixedPoint &b)
Standard multiplication (truncated to input width).
virtual FixedPoint PFullMul(const FixedPoint &a, const FixedPoint &pb)
Full multiplication by a plaintext constant.
virtual BinaryDigit CmpGT_U(const FixedPoint &a, const FixedPoint &b)
Unsigned Greater-Than.
virtual FixedPoint AddNC(const FixedPoint &a, const FixedPoint &b)
Addition without updating internal carry.
virtual BinaryDigit CmpNotEq(const FixedPoint &a, const FixedPoint &b)
Not-Equal.
virtual FixedPoint Not(const FixedPoint &a)
Bitwise NOT.
virtual FixedPoint CPSubC(const FixedPoint &a, const FixedPoint &pb)
Ciphertext-Plaintext subtraction with carry.
virtual FixedPoint PFullMulFast(const FixedPoint &a, const FixedPoint &pb)
Optimized full multiplication by a plaintext constant.
virtual void HalfAdder(const BinaryDigit &a, const BinaryDigit &b, BinaryDigit &sum, BinaryDigit &carry_out)
1-bit half adder.
virtual FixedPoint PAddNC(const FixedPoint &a, const FixedPoint &pb)
Plaintext addition without updating internal carry.
virtual BinaryDigit CmpEq(const FixedPoint &a, const FixedPoint &b)
Equal.
virtual void Swap_if(const BinaryDigit &cond, BinaryDigit &a, BinaryDigit &b)
Conditional swap of two bits if 'cond' is true.
virtual FixedPoint PAdd(const FixedPoint &a, const FixedPoint &pb)
Plaintext addition: result = a + pb.
virtual BinaryDigit CmpLT_U(const FixedPoint &a, const FixedPoint &b)
Unsigned Less-Than.
virtual FixedPoint SubCNC(const FixedPoint &a, const FixedPoint &b)
Subtraction with Carry, but without updating internal carry.
virtual BinaryDigit Gate_XOR3(const BinaryDigit &a, const BinaryDigit &b, const BinaryDigit &c)
3-input XOR gate.
virtual FixedPoint PSub(const FixedPoint &pa, const FixedPoint &b)
Plaintext subtraction: result = pa - b.
virtual FixedPoint Add(const FixedPoint &a, const FixedPoint &b)
Addition: result = a + b.
virtual BinaryDigit CmpGTEq_U(const FixedPoint &a, const FixedPoint &b)
Unsigned Greater-Than or Equal.
virtual FixedPoint ToggleMSB(const FixedPoint &a)
Toggles the Most Significant Bit (useful for sign manipulation).
virtual void DivU(const FixedPoint &a, const FixedPoint &b, FixedPoint &q, FixedPoint &r)
Unsigned division, calculating quotient (q) and remainder (r).
virtual FixedPoint SubNC(const FixedPoint &a, const FixedPoint &b)
Subtraction without updating internal carry.
virtual FixedPoint Neg(const FixedPoint &a)
Arithmetic negation: result = -a.
virtual BinaryDigit Gate_MulAdd(const BinaryDigit &m, const BinaryDigit &a, const BinaryDigit &b, BinaryDigit *carry_out=nullptr)
Multiplies two digits and adds a third, optionally returning carry out.
virtual BinaryDigit CmpGT(const FixedPoint &a, const FixedPoint &b)
Signed Greater-Than.
virtual void Swap_if(const BinaryDigit &cond, FixedPoint &a, FixedPoint &b)
Conditional swap of two FixedPoint values if 'cond' is true.
virtual FixedPoint PSubC(const FixedPoint &pa, const FixedPoint &b)
Plaintext subtraction with carry.
virtual FixedPoint Sub(const FixedPoint &a, const FixedPoint &b)
Subtraction: result = a - b.
virtual BinaryDigit CmpLTEq_U(const FixedPoint &a, const FixedPoint &b)
Unsigned Less-Than or Equal.
virtual FixedPoint PAddCNC(const FixedPoint &a, const FixedPoint &pb)
Plaintext addition with carry, but no update to internal state.
virtual FixedPoint PSubCNC(const FixedPoint &pa, const FixedPoint &b)
Plaintext subtraction with carry, but no update to internal state.
virtual FixedPoint AddC(const FixedPoint &a, const FixedPoint &b)
Addition with Carry: result = a + b + carry.
virtual void HalfSubtractor(const BinaryDigit &a, const BinaryDigit &b, BinaryDigit &sum, BinaryDigit &carry_out)
1-bit half subtractor.
virtual FixedPoint FullMul(const FixedPoint &a, const FixedPoint &b)
Performs full multiplication resulting in potentially larger bit-width.
virtual FixedPoint PBoothsMul(const FixedPoint &a, const FixedPoint &pb)
Multiplication using Booth's algorithm with a plaintext constant.
virtual FixedPoint CPSubNC(const FixedPoint &a, const FixedPoint &pb)
Ciphertext-Plaintext subtraction without updating internal carry.
virtual FixedPoint ShiftRight(const FixedPoint &a, size_t shift, bool is_arithmetic=false)
Shift right (supports both logical and arithmetic/signed shifts).
virtual BinaryDigit CmpLTEq(const FixedPoint &a, const FixedPoint &b)
Signed Less-Than or Equal.
virtual BinaryDigit CmpLT(const FixedPoint &a, const FixedPoint &b)
Signed Less-Than.
virtual void FullAdder(const BinaryDigit &a, const BinaryDigit &b, const BinaryDigit &c, BinaryDigit &sum, BinaryDigit &carry_out)
1-bit full adder with explicit carry-in.
virtual FixedPoint Mux(const BinaryDigit &s, const FixedPoint &a, const FixedPoint &b)
Multiplexer for FixedPoint values: returns 'a' if 's' is true, else 'b'.
virtual BinaryDigit CmpGTEq(const FixedPoint &a, const FixedPoint &b)
Signed Greater-Than or Equal.
virtual FixedPoint PMul(const FixedPoint &a, const FixedPoint &pb)
Standard multiplication by a plaintext constant.
virtual FixedPoint CPSub(const FixedPoint &a, const FixedPoint &pb)
Ciphertext-Plaintext subtraction: result = a - pb.
virtual FixedPoint CPSubCNC(const FixedPoint &a, const FixedPoint &pb)
Ciphertext-Plaintext subtraction with carry, no update.
virtual BinaryDigit Gate_MAJ(const BinaryDigit &a, const BinaryDigit &b, const BinaryDigit &c)
Majority gate: returns true if at least two inputs are true.
virtual FixedPoint PAddC(const FixedPoint &a, const FixedPoint &pb)
Plaintext addition with carry.
virtual FixedPoint AddCNC(const FixedPoint &a, const FixedPoint &b)
Addition with Carry, but without updating internal carry.
virtual FixedPoint PSubNC(const FixedPoint &pa, const FixedPoint &b)
Plaintext subtraction without updating internal carry.
virtual FixedPoint ShiftLeft(const FixedPoint &a, size_t shift)
Logical shift left.
virtual FixedPoint SubC(const FixedPoint &a, const FixedPoint &b)
Subtraction with Borrow (!Carry): result = a - b - !carry.
Abstract base class for FHE-based Arithmetic Logic Units.
Definition BaseALU.h:30
The core manager class for the ComputeFHE library.
Definition ComputeFHE.h:68
A proxy-object representing a single bit that can behave as either a ciphertext or a plaintext.
Definition FixedPoint.h:35
A bit-vector representation of an encrypted or plaintext word.
Definition FixedPoint.h:118