Hypergeometric Random Variable
Hypergeometric Random Variable은 다음과 같이 정의된다.
The probability of having exactly k objects of Type A, for max(0, r – (N-n)) <= k <= min(r, n) is
P(X = k) = C(n, k)*C(N-n, r-k) / C(N, r) .
P{X = i}를 P{X = i-1}에서 유도해낸 다음 프로그램으로 짜는 것이 통계 숙제였다.
public class MyMath
{
// Factorial
public static decimal Factorial(decimal n)
{
decimal result = 1;
for (decimal i = 2; i <= n; ++i)
result *= i;
return result;
}
// Combination
public static decimal Choose(decimal n, decimal k)
{
decimal result = 1;
for (decimal i = Math.Max(k, n - k) + 1; i <= n; ++i)
result *= i;
for (decimal i = 2; i <= Math.Min(k, n - k); ++i)
result /= i;
return result;
}
// Hypergeometric Random Variable
public static decimal Hypergeometric(decimal n, decimal m, decimal i, decimal k)
{
if (i == 0)
return Choose(n, i) * Choose(m, k - i) / Choose(n + m, k);
return (n-i+1)/i*(k-i+1)/(m-k+i)*Hypergeometric(n, m, i - 1, k);
}
}
Modular Exponentiation
이산 구조 교재에 Modular Exponentiation 알고리즘이 제시되어 있었다. 문제는 특정 입력값에 따른 상태 변화를 적어서 제출하는 것이었다. 손으로 계산하고 나서 검증 차원에서 간단히 프로그램을 작성했다.
class Program
{
static void Main(string[] args)
{
Console.WriteLine(mpower(2, 1, 7));
Console.WriteLine(mpower(2, 2, 7));
Console.WriteLine(mpower(2, 5, 7));
Console.WriteLine(mpower(2, 10, 7));
}
static double mpower(double b, double n, double m)
{
if (n == 0)
return 1;
if(n % 2 == 0)
return Math.Sqrt(mpower(b, n/2, m))%m;
return (Math.Sqrt(mpower(b, Math.Floor(n/2), m))%(m*b)%m)%m;
}
}
Author Details
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.