`
digiter
  • 浏览: 120696 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

高斯消元

    博客分类:
  • ICPC
J# 
阅读更多
import java.util.*;
import java.io.*;
import java.math.*;

class Fraction {
    BigInteger a = BigInteger.ZERO, b = BigInteger.ONE;
    Fraction() { }
    Fraction(BigInteger a, BigInteger b)
    {
        BigInteger d = a.gcd(b);
        a = a.divide(d); b = b.divide(d);
        if (b.compareTo(BigInteger.ZERO) < 0) {
            a = a.negate(); b = b.negate();
        }
        this.a = a; this.b = b;
    }
    @Override
    public String toString()
    {
        BigInteger d = a.gcd(b);
        a = a.divide(d);
        b = b.divide(d);
        if (b.compareTo(BigInteger.ONE) == 0)
            return a.toString();
        return a + "/" + b;
    }
    public Fraction add(Fraction p)
    {
        return new Fraction(a.multiply(p.b).add(b.multiply(p.a)), b.multiply(p.b));
    }
    public Fraction subtract(Fraction p)
    {
        return new Fraction(a.multiply(p.b).subtract(b.multiply(p.a)), b.multiply(p.b));
    }
    public Fraction muliply(Fraction p)
    {
        return new Fraction(a.multiply(p.a), b.multiply(p.b));
    }
    public Fraction divide(Fraction p)
    {
        return new Fraction(a.multiply(p.b), b.multiply(p.a));
    }
    public Fraction abs()
    {
        return new Fraction(a.abs(), b.abs());
    }
    public int compareTo(Fraction p)
    {
        return a.multiply(p.b).subtract(b.multiply(p.a)).signum();
    }
}

class Matrix {
    Fraction data[][];
    
}

public class Main {
    
    // Gaussian elimination
    public static Fraction[] gaussianElimination(Fraction A[][], int m) throws Exception
    {
        for (int i = 0; i < m; ++i)
        {
            // Find pivot in column i, starting in row i:
            int maxi = i;
            for (int k = i + 1; k < m; ++k)
                if (A[k][i].abs().compareTo(A[maxi][i].abs()) > 0)
                    maxi = k;
            if (A[maxi][i].a.compareTo(BigInteger.ZERO) == 0)
                throw new Exception("no solution");
            // swap rows i and maxi, but do not change the value of i
            // Now A[i,i] will contain the old value of A[maxi,i].
            if (i != maxi) {
                Fraction tmp[] = A[i];
                A[i] = A[maxi];
                A[maxi] = tmp;
            }
            // divide each entry in row i by A[i,i]
            // Now A[i,i] will have the value 1.
            for (int k = m; k >= i; --k)
                A[i][k] = A[i][k].divide(A[i][i]);
            // subtract A[u,j] * row i from row u
            // Now A[u,j] will be 0, since A[u,j] - A[i,j] * A[u,j] = A[u,j] - 1 * A[u,j] = 0.
            for (int u = i + 1; u < m; ++u)
                for (int k = m; k > i; --k)
                    A[u][k] = A[u][k].subtract(A[u][i].muliply(A[i][k]));
        }
        
        Fraction x[] = new Fraction[m];
        x[m - 1] = A[m - 1][m].divide(A[m - 1][m - 1]);
        for (int i = m - 2; i >= 0; --i)
        {
            x[i] = A[i][m];
            for (int k = i + 1; k < m; ++k)
                x[i] = x[i].subtract(x[k].muliply(A[i][k]));
            x[i] = x[i].divide(A[i][i]);
        }
        return x;
    }
    
    public static void main(String args[])
    {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        Fraction a[][] = new Fraction[105][105];
        Fraction x[] = new Fraction[105];
        
        while (cin.hasNext())
        {
            int m = cin.nextInt();
            for (int i = 0; i < m; ++i)
                for (int j = 0; j <= m; ++j)
                {
                    BigInteger tmp = cin.nextBigInteger();
                    a[i][j] = new Fraction(tmp, BigInteger.ONE);
                }
            try {
                x = gaussianElimination(a, m);
                for (int i = 0; i < m; ++i)
                    System.out.println(x[i]);
                System.out.println();
            } catch (Exception e) {
                System.out.println("No solution.");
                System.out.println();
            }
            
        }
    }
}

分享到:
评论

相关推荐

    高斯消元线性方程

    这个例子中,`GaussianElimination`方法会执行上述的高斯消元步骤,而`BackSubstitution`方法则负责回代求解。当然,实际编程时还需要处理更复杂的边界条件和异常处理,以确保程序的健壮性。 总之,高斯消元法是...

    计算方法-高斯消元算法

    在本压缩包中,你将找到一个C语言实现的高斯消元算法。 高斯消元法的核心思想是通过一系列行变换将系数矩阵转化为阶梯形矩阵或简化阶梯形矩阵,从而逐步求解线性方程组。以下是对这一算法的详细介绍: 1. **行变换...

    java 版本的高斯消元代码

    java 版本的高斯消元代码,新建工程,再把文件复制进去,运行就行了,修改A和b修改参数

    高斯消元求逆_matlab

    3. **上三角化**:通过高斯消元,将矩阵转化为上三角形,这样就可以通过回代求解线性方程组。 4. **计算逆矩阵**:对于上三角形矩阵,可以通过回代从下到上求解出每一行的元素,从而得到逆矩阵。 在MATLAB中,除了...

    高斯消元(非常详细) 高斯消元(非常详细)

    ### 高斯消元详解 #### 一、简介 高斯消元是一种解决线性方程组的方法,尤其适用于处理大规模的线性方程组。它通过一系列的数学操作将线性方程组转化为更容易求解的形式。这种方法的核心在于利用矩阵的性质来简化...

    全主元高斯消元

    在VC6.0环境下,可以使用标准C++库来创建、读取和输出矩阵,编写函数实现全主元高斯消元算法,并在主函数中调用这些函数,最后打印出解。通过调试和测试,可以优化代码并提高其效率。 总之,全主元高斯消元法是解决...

    并行程序作业2关于高斯消元算法的优化

    并行计算领域的高斯消元算法优化是当前计算科学中一个重要的研究方向,尤其是在处理大规模线性代数问题时,其效率和准确性至关重要。高斯消元法是一种基础且广泛使用的解线性方程组的方法,它通过一系列的行变换将...

    NOIP ACM 高斯消元练习+数据题解

    本资料集包含了针对这些竞赛的高斯消元练习及对应的数据题解,旨在帮助参赛者深入理解和熟练应用高斯消元法。 一、高斯消元法概述 高斯消元法由数学家卡尔·弗里德里希·高斯提出,其核心思想是通过一系列行初等...

    高斯消元_高斯消元法_线性方程组_

    高斯消元法是线性代数中一种重要的算法,用于求解线性方程组。这种方法通过一系列矩阵变换,将原始的线性方程组转换为阶梯形或简化阶梯形,进而找到方程组的唯一解或者确定无解或多解的情况。在计算机科学和信息技术...

    高斯消元附解方程神器

    先输入一个数n表示方程元数。 然后再输入一个 n*(n+1)的矩阵 具体见我的博客

    数值方法的实验代码-高斯消元算法

    在数值计算领域,高斯消元算法是一种广泛应用的线性方程组求解方法,它通过一系列矩阵变换将原方程组转化为上三角形或行阶梯形方程组,从而简化了求解过程。这份“数值方法的实验代码-高斯消元算法”提供了实现这一...

    数值计算高斯消元列选主元法

    10. **高斯消元函数**:结合上述函数,按步骤执行高斯消元过程。 11. **回代求解函数**:对于上三角形矩阵,从最底部开始逐行求解未知数。 在实际应用中,为了进一步提高算法的性能和稳定性,还可以考虑引入部分...

    gauss_seq.c.zip_高斯消元

    此外,高斯-约旦消元(Gauss-Jordan elimination)是高斯消元的一种扩展,它不仅将矩阵转化为上三角形,还能进一步将其化为单位矩阵,从而直接得到解。 总结来说,`gauss_seq.c`是一个用C语言实现的高斯消元法串行...

    gauss.rar_gauss column c++_列主元 高斯消元_高斯消元法

    在这个特定的上下文中,我们关注的是"列主元高斯消元法",这是一种优化了的标准高斯消元过程,旨在减少计算中的舍入误差,提高算法的稳定性。 高斯消元法的基本思想是通过一系列行变换将系数矩阵转化为阶梯形或简化...

    高斯消元求解线性方程组

    高斯消元法解决线性方程组 高斯消元法是一种常用的数值分析方法,用于解决线性方程组的问题。本文将对高斯消元法的原理、实现步骤和代码实现进行详细的解释。 高斯消元法的原理 高斯消元法是基于行列式的概念,...

    矩阵中高斯消元程序(包括分别用MATLAB语言和c编写)

    ### 矩阵中高斯消元程序 #### 一、引言 高斯消元法是一种用于求解线性方程组的经典方法,在数学、工程学以及计算机科学领域都有广泛的应用。它通过一系列行变换将系数矩阵转换为上三角矩阵,从而简化了求解过程。...

    高斯消元模版深度认识完整版

    高斯消元模版

    Matlab 高斯消元LU分解.zip

    1. **高斯消元过程**:详细讲解如何在Matlab中实现高斯消元,包括初始化矩阵、执行行交换、行乘和行加操作,并展示每一步的结果。 2. **LU分解算法**:解释如何将高斯消元法转化为LU分解,包括如何构造L和U矩阵,并...

    gaosixiaoyuan.rar_gaussian_方程_迭代法_高斯消元_高斯消元法

    在某些情况下,高斯消元可能结合迭代法,如高斯-塞德尔迭代或雅可比迭代,以提高计算效率和数值稳定性。 描述中提到“用高斯消元法解方程组,源代码以及注释”,这表明该压缩包可能包含一个编程实现高斯消元法的...

    shuzhifenxi.rar_求方程组的解_高斯消元_高斯消元法

    图文件"fig1.fig"到"fig5.fig"可能是为了可视化高斯消元过程中的矩阵变换,帮助理解算法是如何逐步将原始方程组转化为简单形式的。这些图形通常会显示每一步操作后矩阵的状态,使用户能够直观地看到矩阵如何接近最终...

Global site tag (gtag.js) - Google Analytics