/* 
 * File:   mathtools.c
 * Author: Marco Sbaraglia, Stefano Benedettini, Andrea Roli
 *
 * Revised on February 2012
 */

#include <math.h>

#include "boolean.h"
#include "mathtools.h"

int isEven(int x) {
    return x % 2 == 0;
}

int absolute(int x) {
    return x > 0 ? x : -x;
}

int squared(int x) {
    return x*x;
}

int isPrime(int x) {
		int max,i;
		
    if (x < 2)
        return FALSE;
    else if (x == 2)
        return TRUE;
    else if (isEven(x))
        return FALSE;
    max = sqrt(x); // si stabilisce come limite massimo la radice quadrata del numero
    
    /* si prova fino al limite, a partire da 3,
    con tutti i numeri dispari (isEven ha già escluso tutti i numeri pari) */
    for (i = 3; i <= max; i += 2)
        if (x % i == 0) return FALSE;
    return TRUE;
}

double norm(int x[], int len) {
    int i = 0, acc = 0;
    for (; i < len; ++i) {
        acc += x[i] * x[i];
    }
    return sqrt(acc);
}

double norm_p(int x[], int len, double p) {
    int i = 0, acc = 0;
    for (; i < len; ++i)
        acc += pow(absolute(x[i]), p);
    return pow(acc, 1 / p);
}

void sumVect(int x[], int y[], int z[], int len) {
    int i = 0;
    for (; i < len; ++i)
        z[i] = x[i] + y[i];
}

int dot(int x[], int y[], int len) {
    int i = 0, acc = 0;
    for (; i < len; ++i)
        acc += x[i] * y[i];
    return acc;
}

double average(int x[], int len) {
    int i = 0;
    double acc = 0;
    for (; i < len; ++i)
        acc += x[i];
    return acc / len;
}
