Repository: TheAlgorithms/Python

Issue:
New Algorithm - Semiconductor Carrier Concentrations
I've added an algorithm that computes semiconductor concentrations, under the electronics folder.
It takes two of the following three params as input and returns the third one -
1. Hole Concentration
2. Electron Concentration
3. Intrinsic Concentration
closes #4791


Discussion:

Resolving patch:
diff --git a/electronics/carrier_concentration.py b/electronics/carrier_concentration.py
new file mode 100644
--- /dev/null
+++ b/electronics/carrier_concentration.py
@@ -0,0 +1,75 @@
+# https://en.wikipedia.org/wiki/Charge_carrier_density
+# https://www.pveducation.org/pvcdrom/pn-junctions/equilibrium-carrier-concentration
+# http://www.ece.utep.edu/courses/ee3329/ee3329/Studyguide/ToC/Fundamentals/Carriers/concentrations.html
+
+from __future__ import annotations
+
+
+def carrier_concentration(
+    electron_conc: float,
+    hole_conc: float,
+    intrinsic_conc: float,
+) -> tuple:
+    """
+    This function can calculate any one of the three -
+    1. Electron Concentration
+    2, Hole Concentration
+    3. Intrinsic Concentration
+    given the other two.
+    Examples -
+    >>> carrier_concentration(electron_conc=25, hole_conc=100, intrinsic_conc=0)
+    ('intrinsic_conc', 50.0)
+    >>> carrier_concentration(electron_conc=0, hole_conc=1600, intrinsic_conc=200)
+    ('electron_conc', 25.0)
+    >>> carrier_concentration(electron_conc=1000, hole_conc=0, intrinsic_conc=1200)
+    ('hole_conc', 1440.0)
+    >>> carrier_concentration(electron_conc=1000, hole_conc=400, intrinsic_conc=1200)
+    Traceback (most recent call last):
+        File "<stdin>", line 37, in <module>
+    ValueError: You cannot supply more or less than 2 values
+    >>> carrier_concentration(electron_conc=-1000, hole_conc=0, intrinsic_conc=1200)
+    Traceback (most recent call last):
+        File "<stdin>", line 40, in <module>
+    ValueError: Electron concentration cannot be negative in a semiconductor
+    >>> carrier_concentration(electron_conc=0, hole_conc=-400, intrinsic_conc=1200)
+    Traceback (most recent call last):
+        File "<stdin>", line 44, in <module>
+    ValueError: Hole concentration cannot be negative in a semiconductor
+    >>> carrier_concentration(electron_conc=0, hole_conc=400, intrinsic_conc=-1200)
+    Traceback (most recent call last):
+        File "<stdin>", line 48, in <module>
+    ValueError: Intrinsic concentration cannot be negative in a semiconductor
+    """
+    if (electron_conc, hole_conc, intrinsic_conc).count(0) != 1:
+        raise ValueError("You cannot supply more or less than 2 values")
+    elif electron_conc < 0:
+        raise ValueError("Electron concentration cannot be negative in a semiconductor")
+    elif hole_conc < 0:
+        raise ValueError("Hole concentration cannot be negative in a semiconductor")
+    elif intrinsic_conc < 0:
+        raise ValueError(
+            "Intrinsic concentration cannot be negative in a semiconductor"
+        )
+    elif electron_conc == 0:
+        return (
+            "electron_conc",
+            intrinsic_conc ** 2 / hole_conc,
+        )
+    elif hole_conc == 0:
+        return (
+            "hole_conc",
+            intrinsic_conc ** 2 / electron_conc,
+        )
+    elif intrinsic_conc == 0:
+        return (
+            "intrinsic_conc",
+            (electron_conc * hole_conc) ** 0.5,
+        )
+    else:
+        return (-1, -1)
+
+
+if __name__ == "__main__":
+    import doctest
+
+    doctest.testmod()


Test patch: