from math import e, pi
import numpy as np
import scipy as sp
import cmath
from typing import List
import time
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

#jednoriadkovy zapis
def dft(inputs: List) -> List:
    return [sum(v*cmath.exp(-1j*2*pi*k*m/len(inputs)) for m, v in enumerate(inputs))\
          for k in range(len(inputs))]


#prehladnejsi zapis
def dft1(inputs : List) -> List:

    res = [0]*len(inputs)
    n = len(inputs)

    for k in range(n):
        g_k = complex(0)
        for m, vector in enumerate(inputs):
            g_k += vector * cmath.exp(-1j *2 *pi *k *m /n)

        res[k] = g_k

    return np.arrayres


def idft1(FmList : List) -> List:

    n = len(FmList)
    res = []

    for k in range(n):
        g_k = 0
        for m in range(n):
            g_k += FmList[m]*cmath.exp(2j*pi*k*m/n)
        g_k /= n
        res.append(g_k)
        
    return res

def idft(FmList : List) -> List:
    return [(1/len(FmList)) * sum( FmList[m]*cmath.exp(2j*pi*k*m/len(FmList))\
                         for m in range(len(FmList)))\
                         for k in range(len(FmList))]

if __name__ == "__main__":
    N = 10
    for i in range(3):
        
        X = np.linspace(0,2*pi,num=N)
        Y = np.cos(X)
        print(f'pocitanie fft pre cos od 0 po 2 pi s {N} vstupmi moj algoritmus:')
        start = time.time()
        Z = dft(Y)
        print(f'cas behu: {time.time()-start} s')
        #print('prve 3 hodnoty : \n',Z[:10])

        start = time.time()
        print(f'\npocitanie fft pre cos od 0 po 2 pi s {N} vstupmi scipy:')
        start = time.time()
        Z = np.fft.fft(Y)
        print(f'cas behu: {time.time()-start} s')
        #print('prve 3 hodnoty : \n',Z[:10])
        N *= 10
    
    for i in range(4):
        X = np.linspace(0,2*pi,num=N)
        Y = np.cos(X)
        print(f'\npocitanie fft pre cos od 0 po 2 pi s {N} vstupmi scipy:')
        start = time.time()
        Z = np.fft.fft(Y)
        print(f'cas behu: {time.time()-start} s')
        #print('prve 3 hodnoty : \n',Z[:10])
        N *= 10
   






        
        
    

