ডিস্ক্রিট ফুরিয়ার ট্রান্সফর্ম গণনা করুন


9

যেকোন দৈর্ঘ্যের অনুক্রমের জন্য ডিসক্রেট ফুয়ের ট্রান্সফর্ম (ডিএফটি) প্রয়োগ করুন। এটি ফাংশন বা একটি প্রোগ্রাম হিসাবে বাস্তবায়িত হতে পারে এবং ক্রমটি একটি যুক্তি হিসাবে বা স্ট্যান্ডার্ড ইনপুট ব্যবহার করে দেওয়া যেতে পারে।

অ্যালগরিদম অগ্রণী দিকের স্ট্যান্ডার্ড ডিএফটি এর উপর ভিত্তি করে একটি ফলাফল গণনা করবে। ইনপুট ক্রম দৈর্ঘ্য Nএবং গঠিত [x(0), x(1), ..., x(N-1)]। আউটপুট ক্রম একই দৈর্ঘ্য হবে এবং [X(0), X(1), ..., X(N-1)]প্রতিটি X(k)নীচের সম্পর্কের দ্বারা সংজ্ঞায়িত যেখানে গঠিত ।

DFT

বিধি

  • এই তাই সংক্ষিপ্ততম সমাধানটি জয়লাভ করে।
  • যে বিল্টিনগুলি DFT কে সামনের বা পিছনে গণনা করে (বিপরীত হিসাবেও পরিচিত) এর অনুমতি নেই।
  • ভাসমান-পয়েন্টের ভুলত্রুটিগুলি আপনার বিরুদ্ধে গণনা করা হবে না।

পরীক্ষার কেস

DFT([1, 1, 1, 1]) = [4, 0, 0, 0]
DFT([1, 0, 2, 0, 3, 0, 4, 0]) = [10, -2+2j, -2, -2-2j, 10, -2+2j, -2, -2-2j]
DFT([1, 2, 3, 4, 5]) = [15, -2.5+3.44j, -2.5+0.81j, -2.5-0.81j, -2.5-3.44j]
DFT([5-3.28571j, -0.816474-0.837162j, 0.523306-0.303902j, 0.806172-3.69346j, -4.41953+2.59494j, -0.360252+2.59411j, 1.26678+2.93119j] = [2, -3j, 5, -7j, 11, -13j, 17]

সাহায্য

2 পাওয়ারের সমান দৈর্ঘ্য সহ সিক্যুয়েন্সের জন্য এফএফটি অ্যালগরিদম ব্যবহার করে ডিএফটি সন্ধানের জন্য পূর্ববর্তী চ্যালেঞ্জ ছিল You আপনি এখানে কিছু কৌশল খুঁজে পেতে পারেন যা আপনাকে এখানে সহায়তা করতে পারে। মনে রাখবেন যে এই চ্যালেঞ্জটি আপনাকে কোনও জটিলতায় সীমাবদ্ধ করে না এবং যে কোনও দৈর্ঘ্যের ক্রমগুলির জন্য কাজ করার জন্য আপনার সমাধানও প্রয়োজন।

উত্তর:


2

জেলি , 16 15 বাইট

LR’µ×'÷L-*²³÷S€

এটি অনলাইন চেষ্টা করুন!

কিভাবে এটা কাজ করে

LR’µ×'÷L-*²³÷S€  Main link. Argument [x(0), ..., x(N-1)].

L                Length; yield N.
 R               Range; yield [1, ..., N].
  ’              Decrement; yield [0, ..., N-1].
   µ             Begin a new, monadic chain. Argument: [0, ..., N-1]
    ×'           Spawned multiply [0, ..., N-1] with itself, yielding the matrix
                 of all possible products k×n.
      ÷L         Divide each product by N.
        -*       Compute (-1)**(kn÷L) for each kn.
          ²      Square each result, computing (-1)**(2kn÷L).
           ³÷    Divide [x(0), ..., x(N-1)] by the results.
             S€  Compute the sum for each row, i.e., each X(k).


5

পাইথন 3, 77 বাইট

lambda x,e=enumerate:[sum(t/1j**(4*k*n/len(x))for n,t in e(x))for k,_ in e(x)]

আইডিয়নে এটি পরীক্ষা করুন ।

কোডটি সমতুল্য সূত্র ব্যবহার করে

সূত্র


বাহ! সংক্ষিপ্ত কোডের অনুমতি দিতে পারে এমন সমতুল্য সূত্রগুলি দেখে এটি দুর্দান্ত।
মাইল

4

জে, 30 20 বাইট

3 মাইল @ মাইল ধন্যবাদ ।

সত্য যে ব্যবহার করে e^ipi = -1

সূত্রটি হয়ে যায় X_k = sum(x_n / ((-1)^(2nk/N)))

+/@:%_1^2**/~@i.@#%#

ব্যবহার

>> DCT =: +/@:%_1^2**/~@i.@#%#
>> DCT 1 2 3 4 5
<< 15 _2.5j3.44095 _2.5j0.812299 _2.5j_0.812299 _2.5j_3.44095

>>STDIN কোথায় এবং STDOUT <<হয়।

"ভাসমান-পয়েন্টের অপ্রতুলতাগুলি আপনার বিরুদ্ধে গণনা করা হবে না।"


3

এমএটিএল , 20 16 বাইট

-1yn:qt!Gn/E*^/s

ইনপুট হ'ল একটি কলাম ভেক্টর, অর্থাত্ সেমিকোলন দ্বারা কমাগুলি প্রতিস্থাপন করুন:

[1; 1; 1; 1]
[1; 0; 2; 0; 3; 0; 4; 0]
[1; 2; 3; 4; 5]
[5-3.28571j; -0.816474-0.837162j; 0.523306-0.303902j; 0.806172-3.69346j; -4.41953+2.59494j; -0.360252+2.59411j; 1.26678+2.93119j] 

এটি এক্সপ্রেস ( ) = uses1 , এবং এমএটিএল-এর পাওয়ার-অপারেটন অ-পূর্ণসংখ্যক এক্সপোজেંટ সহ (বেশিরভাগ প্রোগ্রামিং ভাষায় যেমন) প্রধান শাখার ফলাফল তৈরি করে তার উপর ভিত্তি করে এটি লিকি নুনের উত্তরে সূত্রটি ব্যবহার করে ।

এটি অনলাইন চেষ্টা করুন!

জটিল সংখ্যার সাথে অক্টাভের অদ্ভুত ব্যবধানের কারণে, আসল এবং কাল্পনিক অংশগুলি একটি স্থান দ্বারা পৃথক করা হয়, ফলাফল ভেক্টরের বিভিন্ন প্রবেশিকা হিসাবে। যদি এটি খুব কুরুচিপূর্ণ দেখায়, আউটপুটের প্রতিটি প্রবেশ আলাদা আলাদা সারিতে !করতে শেষে ( 17 বাইট ) যুক্ত করুন।

ব্যাখ্যা

-1      % Push -1
y       % Get input implicitly. Push a copy below and one on top of -1
n:q     % Row vector [0 1 ... N-1] where N is implicit input length
t!      % Duplicate and transpose: column vector
Gn      % Push input length
/       % Divide
E       % Multiply by 2
*       % Multiply, element-wise with broadcast. Gives the exponent as a matrix
^       % Power (base is -1), element-wise. Gives a matrix
/       % Divide matrix by input (column vector), element-wise with broadcast
s       % Sum

2

পাইথ, 30

ms.e*b^.n1****c_2lQk.n0d.j0)QU

পরীক্ষা স্যুট

খুব নির্বোধ পন্থা, সূত্রের কেবল একটি বাস্তবায়ন। মানগুলি সহ বিভিন্ন ছোট ছোট ফ্লোটিং পয়েন্ট ইস্যুগুলিতে চালিত হয় যা সংযোজন বিপরীত হওয়া উচিত যা মানগুলির শূন্যের থেকে সামান্য দূরে থাকে adding

অদ্ভুতভাবে .jকোনও যুক্তি দিয়ে কাজ করছে বলে মনে হচ্ছে না, তবে আমি এটি সঠিকভাবে ব্যবহার করছি কিনা তা নিশ্চিত নই।


1
10 কে অভিনন্দন !!
লুইস মেন্ডো



2

পাইথন 2, 78 বাইট

l=input();p=1
for _ in l:print reduce(lambda a,b:a*p+b,l)*p;p*=1j**(4./len(l))

বহুপদী প্রতিটি ক্ষমতার মূল্যায়ন করা হয় pএর 1j**(4./len(l))

অভিব্যক্তি reduce(lambda a,b:a*p+b,l)বহুপদী কর্তৃক প্রদত্ত মূল্যায়ন lমূল্যের ওপর pHorner এর পদ্ধতির মাধ্যমে:

reduce(lambda a,b:a*10+b,[1,2,3,4,5])
=> 12345

ব্যতীত, আউটপুট তালিকার বিপরীত হয়, শেষে ধ্রুবক শব্দ সহ। আমরা এটিকে বিপরীত করতে পারি, তবে p**len(l)==1ফুরিয়ার সহগগুলির জন্য, আমরা pসম্পূর্ণ ফলাফলকে উল্টানো এবং গুণনের একটি হ্যাক ব্যবহার করতে পারি p

কিছু সমান দৈর্ঘ্যের প্রচেষ্টা:

l=input();i=0
for _ in l:print reduce(lambda a,b:(a+b)*1j**i,l,0);i+=4./len(l)

l=input();i=0
for _ in l:print reduce(lambda a,b:a*1j**i+b,l+[0]);i+=4./len(l)

1 বাইট আরও (79) এর জন্য একটি ফাংশন হিসাবে:

lambda l:[reduce(lambda a,b:a*1j**(i*4./len(l))+b,l+[0])for i in range(len(l))]

পুনরাবৃত্তির একটি প্রচেষ্টা (৮০):

f=lambda l,i=0:l[i:]and[reduce(lambda a,b:(a+b)*1j**(i*4./len(l)),l,0)]+f(l,i+1)

স্বতঃস্ফূর্তভাবে অনুকরণ reduce(80):

l=input();p=1;N=len(l)
exec"s=0\nfor x in l:s=s*p+x\nprint s*p;p*=1j**(4./N);"*N


1

পাইথন 2, 89 বাইট

সত্য যে ব্যবহার করে e^ipi = -1

সূত্রটি হয়ে যায় X_k = sum(x_n / ((-1)^(2nk/N)))

lambda a:[sum(a[x]/(-1+0j)**(x*y*2./len(a))for x in range(len(a)))for y in range(len(a))]

আইডিয়ন!


আলাদা উত্তর হিসাবে পোস্ট করুন!
ফাঁস নুন

ঠিক আছে, যদি আপনি বলেন।
ডেনিস


1

অ্যাক্সিয়াম, 81 বাইট

g(x)==(#x<2=>x;[reduce(+,[x.j/%i^(4*k*(j-1)/#x)for j in 1..#x])for k in 0..#x-1])

এখানে কারও পোস্ট করা সূত্র ব্যবহার করে। ফলাফল

(6) -> g([1,1,1,1])
   (6)  [4,0,0,0]
                                    Type: List Expression Complex Integer
(7) -> g([1,2,3,4])
   (7)  [10,- 2 + 2%i,- 2,- 2 - 2%i]
                                    Type: List Expression Complex Integer
(8) -> g([1,0,2,0,3,0,4,0])
   (8)  [10,- 2 + 2%i,- 2,- 2 - 2%i,10,- 2 + 2%i,- 2,- 2 - 2%i]
                                    Type: List Expression Complex Integer
(11) -> g([1,2,3,4,5])
   (11)
        5+--+4       5+--+3    5+--+2      5+--+
        \|%i   + 5%i \|%i   - 4\|%i   - 3%i\|%i  + 2
   [15, --------------------------------------------,
                           5+--+4
                           \|%i
    5+--+4       5+--+3    5+--+2      5+--+
    \|%i   + 3%i \|%i   - 5\|%i   - 2%i\|%i  + 4
    --------------------------------------------,
                       5+--+4
                       \|%i
    5+--+4       5+--+3    5+--+2      5+--+
    \|%i   + 4%i \|%i   - 2\|%i   - 5%i\|%i  + 3
    --------------------------------------------,
                       5+--+4
                       \|%i
    5+--+4       5+--+3    5+--+2      5+--+
    \|%i   + 2%i \|%i   - 3\|%i   - 4%i\|%i  + 5
    --------------------------------------------]
                       5+--+4
                       \|%i
                                    Type: List Expression Complex Integer
(12) -> g([1,2,3,4,5.])
   (12)
   [15.0, - 2.5 + 3.4409548011 779338455 %i, - 2.5 + 0.8122992405 822658154 %i,
    - 2.5 - 0.8122992405 822658154 %i, - 2.5 - 3.4409548011 779338455 %i]
                                      Type: List Expression Complex Float

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.