<T>LAPACK 0.1.2
C++ Template Linear Algebra PACKage
Loading...
Searching...
No Matches
laed5.hpp
Go to the documentation of this file.
1
3//
4// Copyright (c) 2025, University of Colorado Denver. All rights reserved.
5//
6// This file is part of <T>LAPACK.
7// <T>LAPACK is free software: you can redistribute it and/or modify it under
8// the terms of the BSD 3-Clause license. See the accompanying LICENSE file.
9
10#ifndef TLAPACK_LAED5_HH
11#define TLAPACK_LAED5_HH
12
14
15namespace tlapack {
16
60template <class d_t, class z_t, class delta_t, class real_t, class idx_t>
61void laed5(idx_t i, d_t& d, z_t& z, delta_t& delta, real_t rho, real_t& dlam)
62{
63 real_t w, b, c, tau, temp;
64 real_t del = d[1] - d[0];
65 if (i == 0) {
66 w = real_t(1.0) + real_t(2.0) * rho * (z[1] * z[1] - z[0] * z[0]) / del;
67
68 if (w > 0) {
69 b = del + rho * (z[0] * z[0] + z[1] * z[1]);
70 c = rho * z[0] * z[0] * del;
71
72 // B > 0, always
73
74 tau = real_t(2.0) * c / (b + sqrt(abs(b * b - real_t(4.0) * c)));
75 dlam = d[0] + tau;
76 delta[0] = -z[0] / tau;
77 delta[1] = z[1] / (del - tau);
78 }
79 else {
80 b = -del + rho * (z[0] * z[0] + z[1] * z[1]);
81 c = rho * z[1] * z[1] * del;
82
83 if (b > 0) {
84 tau = real_t(-2.0) * c / (b + sqrt(b * b + real_t(4.0) * c));
85 }
86 else {
87 tau = (b - sqrt(b * b + real_t(4.0) * c)) / real_t(2.0);
88 }
89
90 dlam = d[1] + tau;
91 delta[0] = -z[0] / (del + tau);
92 delta[1] = -z[1] / tau;
93 }
94
95 temp = sqrt(delta[0] * delta[0] + delta[1] * delta[1]);
96 delta[0] = delta[0] / temp;
97 delta[1] = delta[1] / temp;
98 }
99 else {
100 // Now I = 2
101 b = -del + rho * (z[0] * z[0] + z[1] * z[1]);
102 c = rho * z[1] * z[1] * del;
103
104 if (b > 0) {
105 tau = (b + sqrt(b * b + real_t(4.0) * c)) / real_t(2.0);
106 }
107 else {
108 tau = real_t(2.0) * c / (-b + sqrt(b * b + real_t(4.0) * c));
109 }
110
111 dlam = d[1] + tau;
112 delta[0] = -z[0] / (del + tau);
113 delta[1] = -z[1] / tau;
114 temp = sqrt(delta[0] * delta[0] + delta[1] * delta[1]);
115 delta[0] = delta[0] / temp;
116 delta[1] = delta[1] / temp;
117 }
118
119 return;
120}
121} // namespace tlapack
122
123#endif // TLAPACK_LAED5_HH
Sort the numbers in D in increasing order (if ID = 'I') or in decreasing order (if ID = 'D' ).
Definition arrayTraits.hpp:15
typename traits::real_type_traits< Types..., int >::type real_type
The common real type of the list of types.
Definition scalar_type_traits.hpp:113
void laed5(idx_t i, d_t &d, z_t &z, delta_t &delta, real_t rho, real_t &dlam)
LAED5 used by STEDC.
Definition laed5.hpp:61