Математические алгоритмы План лекции: 1) НОД 2) НОК 3) Проверка числа на простоту 4) Решето Эратосфена 5) Факторизация числа 6) Бинарное возведение в степень 7) Дерево Штерна-Броко 8) Математическое ожидание Наибольший общий делитель (НОД) Greatest common divisor (GCD) НОД(a, b) – наибольшее целое число, на которое делится и a, и b. GCD(a, b) max(k ) kN , k |a & k |b Алгоритм Евклида нахождения НОД int gcd(int a, int b) { if(b==0) return a; else return gcd(b, a%b); } Реализация алгоритма Евклида без рекурсии int gcd(int a, int b) { while(a!=0 && b!=0) { if(a>b) a%=b; else b%=a; } return a+b; } Наименьшее общее кратное (НОК) Least common multiple (LCM) a *b LCM (a, b) GCD(a, b) Проверка числа на простоту за O(sqrtN) bool isPrime(int x) { if(x<2) return false; for(int i=2; i<=sqrt(x); i++) if(x%i==0) return false; return true; } Решето Эратосфена Реализация решета Эратосфена за О(NloglogN) vector<bool> primes(n, 1); primes[0]=primes[1]=0; for(int i=2; i<sqrt(n); ++i) if(primes[i]) for(int j=i*i; j<n; j+=i) primes[j]=0; Факторизация чисел Факторизация числа – это представление числа в виде произведение простых множителей. x p p ... p k1 1 k2 2 kn n Реализация факторизации числа за O(sqrtN) vector<int> factors; for(int i=2; i<=sqrt(x); i++) while(x%i==0) { factors.push_back(i); x = x/i; } if(x>1) factors.push_back(x); Бинарное возведение в степень a (a n/2 2 a (a ) *a n n ) n/2 2 Реализация бинарного возведения в степень за O(logN) int power(int a, int n) { if(n==1) return a; int t = power(a, n/2); if(n%2==0) return t*t; else return t*t*a; } Дерево Штерна-Броко Математическое ожидание Среднее значение случайной величины в теории вероятностей Пусть xi – одно из возможных значений случайной величины, а pi – вероятность этой величины. Тогда формула мат. Ожидания примет вид: M xi pi Пример: xi 1 3 4 7 9 pi 0.1 0.2 0.1 0.3 0.3 М=1*0.1+3*0.2+4*0.1+7*0.3+9*0.3=5.9 Спасибо за внимание! Домашнее задание ipc.susu.ac.ru -> Рабочее место участника -> Тренировка 4 (проводит Peeka)