def economic_qs_linear(G):
    r"""Economic eigen decomposition for symmetric matrices ``dot(G, G.T)``.

    It is theoretically equivalent to ``economic_qs(dot(G, G.T))``.
    Refer to :func:`numpy_sugar.economic_qs` for further information.

    Args:
        G (array_like): Matrix.

    Returns:
        tuple: ``((Q0, Q1), S0)``.
    """
    import dask.array as da

    if not isinstance(G, da.Array):
        G = asarray(G, float)

    if G.shape[0] > G.shape[1]:
        (Q, Ssq, _) = svd(G, full_matrices=True)
        S0 = Ssq ** 2
        rank = len(S0)
        Q0, Q1 = Q[:, :rank], Q[:, rank:]
        return ((Q0, Q1), S0)

    return economic_qs(G.dot(G.T))