본문 바로가기
C#, MONO

c# 다항식 연산

by gigasound 2021. 10. 8.

 

 

 

 


다항식 연산

다항식(Polynomial)과 다항식 간의 연산은 신호처리 과정에서 가끔 사용합니다. 특히 필터 합성에서 계수를 합성할 때 사용합니다. 이 글에서는 C#으로 다항식의 덧셈과 곱셈을 하는 클래스를 만들어 보겠습니다.


다항식 연산용 클래스

다음과 같이 다항식의 차수 degree와 차수별 계수를 기록하는 클래스를 만듭니다. 계수 coef는 차수보다 1개 더 많이 사용됩니다. 즉 degree = 2면 $a_2 x^2 + a_1 x + a_0 $ 형식으로, coef []는 $[a_2, a_1, a_0 ]$로 기록됩니다. 

아래의 클래스는 Add()는 다항식 덧셈 연산을, Multiply()는 다항식 곱셉 연산을 합니다. 

using System;

namespace test_IIR_FreqResponse {
    public class Polynomial{
        private int _degree;
        private float[] _coef = new float[93];

        /// <summary>
        /// </summary>
        public Polynomial(){; }

        /// <summary>
        /// </summary>
        public Polynomial(int degree) {
            _degree = degree;
        }

        /// <summary>
        /// </summary>
        public void Clear(){
            _degree = 0;
            for(int i =0;i<93;i++){
                _coef[i] = 0.0f;
            }
        }

        /// <summary>
        /// </summary>
        public int Degree{
            get{ return _degree; }
            set{ _degree = value; }
        }

        /// <summary>
        /// </summary>
        public float Get_Coef(int idx){
            return _coef[idx];
        }

        /// <summary>
        /// </summary>
        public void Set_Coef(int idx, float value){
            _coef[idx] = value;
        }

        /// <summary>
        /// idx+1 = degree 로 입력 해야 한다.
        /// 2차면 3개를 초고차 항부터... 
        /// </summary>
        public void Insert(int idx,float value){
            _coef[idx] = value;
        }

        public void Insert(ref float[] values){ 
            for(int i=0;i<values.Length;i++){
                _coef[i] = values[i];
            }
        }
        /// <summary>
        /// </summary>
        public void Print() {
            string str = "";
            for(int i = 0;i < _degree;i++) {
                str = string.Format("({0:0.000}*x^{1})",_coef[i],(_degree - i));
                Console.Write(str);
                if(_coef[i + 1] > 0) {
                    Console.Write("+");
                }
            }
            str = string.Format("({0:0.000)\r\n}",_coef[_degree]);
            Console.Write(str);
        }

        /// <summary>
        /// </summary>
        public void Add(Polynomial a,Polynomial b) {
            if(a.Degree > b.Degree) {
                this.Copy(a);
                for(int i = 0;i <= b.Degree;i++) {
                    _coef[i + (_degree - b.Degree)] += b.Get_Coef(i);
                }
            }
            else {
                this.Copy(b);
                for(int i = 0;i <= b.Degree;i++) {
                    _coef[i + (_degree - a.Degree)] += a.Get_Coef(i);
                }
            }
        }

        /// <summary>
        /// </summary>
        private void Copy(Polynomial a){
            _degree = a.Degree;
            for(int i =0;i<93;i++){
                _coef[i] = a.Get_Coef(i);
            }
        }

        /// <summary>
        /// </summary>
        public void Multiply(Polynomial a,Polynomial b) {
            _degree = a.Degree + b.Degree;
            for(int i = 0;i < a.Degree + b.Degree + 1;i++) {
                _coef[i] = 0;
            }
            for(int i = 0;i < a.Degree + 1;i++) {
                for(int j = 0;j < b.Degree + 1;j++) {
                    _coef[i + j] += a.Get_Coef(i) * b.Get_Coef(j);
                }
            }
        }
    } //- class
}//- namespace

덧셈 실험

다음과 같이 초기화하고 다항식 덧셈 결과를 보겠습니다.

using System;

namespace test_IIR_FreqResponse {
    class Program {
        static void Main(string[] args) {
            Polynomial a = new Polynomial();
            Polynomial b = new Polynomial();
            Polynomial p = new Polynomial();
            a.Degree=2;
            b.Degree=2;
            float[] coef = new float[3] {1.0f,1.0f,1.0f};
            a.Insert(ref coef);
            b.Insert(ref coef);
            p.Add(a,b);
            p.Print();
            Console.ReadKey();
        }
    }
}

그러면 아래와 같이 출력이 됩니다. 

(2.000*x^2)+(2.000*x^1)+(2.000)

다항식 곱셈 실험

다항식 곱셈의 실험을 합니다.

using System;

namespace test_IIR_FreqResponse {
    class Program {
        static void Main(string[] args) {
            Polynomial a = new Polynomial();
            Polynomial b = new Polynomial();
            Polynomial p = new Polynomial();
            a.Degree=2;
            b.Degree=2;
            float[] coef = new float[3] {1.0f,1.0f,1.0f};
            a.Insert(ref coef);
            b.Insert(ref coef);
            p.Multiply(a,b);
            p.Print();
            Console.ReadKey();
        }
    }
}

 출력 결과는 다음과 같습니다. 2x2차원의 다항식 계산으로 $x^4$로 출력되고 있습니다. 

(1.000*x^4)+(2.000*x^3)+(3.000*x^2)+(2.000*x^1)+(1.000)

광고좀 꾹 눌러주시면 고맙겠습니다. 


위의 내용을 참조용으로만 사용해주세요. 무단 도용이나 무단 복제는 불허합니다.

기타 문의 사항은 gigasound@naver.com에 남겨 주시면 고맙겠습니다.

'C#, MONO' 카테고리의 다른 글

c# 프로세스 동작시간 측정  (0) 2021.11.12
c#의 구조체  (0) 2021.10.08
c#의 배열과 리스트  (0) 2021.10.06
c#의 Enum 멤버의 정보 추출  (0) 2021.10.06
테이블 컬럼 조작  (0) 2021.08.21