Алгоритм Штрассена предназначен для быстрого умножения матриц. Он был разработан Фолькером Штрассеном в 1969 году и является обобщением
метода умножения Карацубы на матрицы.
 В отличие от традиционного алгоритма умножения матриц (по формуле 
  
    
      
        
          c
          
            i
            j
          
        
        =
        ∑
        
          a
          
            i
            k
          
        
        
          b
          
            k
            j
          
        
      
    
    {\displaystyle c_{ij}=\sum a_{ik}b_{kj}}
  
), работающего за время 
  
    
      
        Θ
        (
        
          n
          
            
              log
              
                2
              
            
            ⁡
            8
          
        
        )
        =
        Θ
        (
        
          n
          
            3
          
        
        )
      
    
    {\displaystyle \Theta (n^{\log _{2}8})=\Theta (n^{3})}
  
, алгоритм Штрассена умножает матрицы за время 
  
    
      
        Θ
        (
        
          n
          
            
              log
              
                2
              
            
            ⁡
            7
          
        
        )
        =
        O
        (
        
          n
          
            2.81
          
        
        )
      
    
    {\displaystyle \Theta (n^{\log _{2}7})=O(n^{2.81})}
  
, что даёт выигрыш на больших плотных матрицах.
 Несмотря на то, что алгоритм Штрассена является асимптотически не самым быстрым из существующих алгоритмов быстрого умножения матриц, он проще программируется и эффективнее при умножении матриц относительно малого размера, поэтому именно он чаще используется на практике.
 Если добавить к матрицам 
  
    
      
        A
      
    
    {\displaystyle A}
  
 и 
  
    
      
        B
      
    
    {\displaystyle B}
  
 одинаковые нулевые строки и столбцы, их произведение станет равно матрице 
  
    
      
        A
        B
      
    
    {\displaystyle AB}
  
 с теми же добавленными строками и столбцами. Поэтому можно рассматривать только матрицы размера 
  
    
      
        n
        =
        
          2
          
            k
          
        
        ,
         
        k
        ∈
        
          
            N
          
        
      
    
    {\displaystyle n=2^{k},\ k\in {\mathbb {N} }}
  
, а другие случаи сводить к этому добавлением нулей, отчего 
  
    
      
        n
      
    
    {\displaystyle n}
  
 может увеличиться лишь вдвое.
 Пусть 
  
    
      
        A
        ,
        B
      
    
    {\displaystyle A,B}
  
 – матрицы размера 
  
    
      
        
          2
          
            k
          
        
        ×
        
          2
          
            k
          
        
      
    
    {\displaystyle 2^{k}\times 2^{k}}
  
. Их можно представить как блочные матрицы размера 
  
    
      
        (
        2
        ×
        2
        )
      
    
    {\displaystyle (2\times 2)}
  
 из 
  
    
      
        (
        
          2
          
            k
            −
            1
          
        
        ×
        
          2
          
            k
            −
            1
          
        
        )
      
    
    {\displaystyle (2^{k-1}\times 2^{k-1})}
  
–матриц:
 По принципу блочного умножения, матрица 
  
    
      
        A
        B
      
    
    {\displaystyle AB}
  
 выражается через их произведение
 где в правой части происходит восемь умножений матриц размера 
  
    
      
        
          2
          
            k
            −
            1
          
        
        ×
        
          2
          
            k
            −
            1
          
        
      
    
    {\displaystyle 2^{k-1}\times 2^{k-1}}
  
. Поскольку матрицы образуют кольцо, то для вычисления правой части годится любой алгоритм умножения 
  
    
      
        (
        2
        ×
        2
        )
      
    
    {\displaystyle (2\times 2)}
  
-матриц, использующий лишь сложения, вычитания и умножения. Штрассен предложил такой алгоритм с семью умножениями:
 Каждое умножение можно совершать рекурсивно по той же процедуре, а сложение – тривиально, складывая 
  
    
      
        (
        
          2
          
            k
            −
            1
          
        
        
          )
          
            2
          
        
      
    
    {\displaystyle (2^{k-1})^{2}}
  
 элементов. Тогда время работы алгоритма 
  
    
      
        T
        (
        n
        )
      
    
    {\displaystyle T(n)}
  
 оценивается через рекуррентное соотношение:
 Ниже приведён пример реализации алгоритма на языке Python с использованием библиотеки NumPy для быстрого взятия подматриц. Основная функция – strassen_mul. Предполагается, что все матрицы квадратны, представлены типом numpy.array и их размер является степенью 2.
 При небольших размерах матрицы прямое умножение оказывается быстрее алгоритма Штрассена из-за большого числа сложений в последнем. Граница таких размеров зависит от соотношения времени сложения и умножения элементов и поэтому может варьироваться в зависимости от аппаратной среды. В коде за её назначение отвечает константа TRIVIAL_MULTIPLICATION_BOUND.
 Штрассен был первым, кто показал возможность умножения матриц более эффективным способом, чем стандартный. После публикации его работы в 1969 начались активные поиски более быстрого алгоритма. Самым асимптотически быстрым алгоритмом на сегодняшний день является алгоритм Копперсмита — Винограда, позволяющий перемножать матрицы за 
  
    
      
        
          
            O
          
        
        (
        
          n
          
            2.376
          
        
        )
      
    
    {\displaystyle {\rm {O}}(n^{2.376})}
  
 операций, предложенный в 1987 году и усовершенствованный в 2011 году до уровня 
  
    
      
        
          
            O
          
        
        (
        
          n
          
            2.3727
          
        
        )
      
    
    {\displaystyle {\rm {O}}(n^{2.3727})}
  
. Этот алгоритм не представляет практического интереса в силу астрономически большой константы в оценке арифметической сложности. Вопрос о предельной в асимптотике скорости перемножения матриц не решен. Существует гипотеза Штрассена о том, что для достаточно больших 
  
    
      
        n
      
    
    {\displaystyle n}
  
 существует алгоритм перемножения двух матриц размера 
  
    
      
        n
        ×
        n
      
    
    {\displaystyle n\times n}
  
 за 
  
    
      
        
          
            O
          
        
        (
        
          n
          
            2
            +
            ε
          
        
        )
      
    
    {\displaystyle {\rm {O}}(n^{2+\varepsilon })}
  
 операций, где 
  
    
      
        ε
      
    
    {\displaystyle \varepsilon }
  
 сколь угодно малое наперед заданное положительное число. Эта гипотеза имеет сугубо теоретический интерес, так как размер матриц, для которых 
  
    
      
        ε
      
    
    {\displaystyle \varepsilon }
  
 действительно мало, по всей видимости очень велик.
 Вопрос о построении наиболее быстрого и устойчивого практического алгоритма умножения больших матриц также остается нерешённым.
 Существует модификация алгоритма Штрассена, для которой требуется 7 умножений и 15 сложений (вместо 18 для обычного алгоритма Штрассена).
 Матрицы 
  
    
      
        A
        ,
        
        B
        ,
        
        C
      
    
    {\displaystyle A,\,B,\,C}
  
 делятся на блочные подматрицы как показано выше.
 Вычисляются промежуточные элементы 
  
    
      
        
          S
          
            1
          
        
        ,
        
        …
        ,
        
        
          S
          
            8
          
        
        ,
        
        
          P
          
            1
          
        
        ,
        
        …
        ,
        
        
          P
          
            7
          
        
        ,
        
        
          T
          
            1
          
        
        ,
        
        
          T
          
            2
          
        
      
    
    {\displaystyle S_{1},\,\ldots ,\,S_{8},\,P_{1},\,\ldots ,\,P_{7},\,T_{1},\,T_{2}}
  

 Элементы матрицы 
  
    
      
        C
      
    
    {\displaystyle C}
  
 вычисляются следующим образом:
 Алгоритм Штрассена является билинейным алгоритмом, его коэффициенты являются корнями кубической системы уравнений Брента. Для класса точных алгоритмов <2x2x2> это минимальная задача, решение которой позволяет уменьшить число умножений в кольце элементов матриц. Проблема поиска новых алгоритмов заключается в том, что система Брента нелинейная, числа неизвестных и уравнений (эти числа не совпадают) быстро растет с увеличением размера матриц и требуются решения только с большим количеством нулей.
 B 2013 году после частичного преодоления этих проблем удалось найти первый практически реализуемый билинейный алгоритм умножения матриц, который асимптотически быстрее алгоритма Штрассена. Алгоритм Смирнова <3x3x6; 40> умножает матрицу 3X3 на матрицу 3x6, используя 40 умножений вместо 54. Его асимптотическая сложность 
  
    
      
        O
        (
        
          n
          
            
              log
              
                54
              
            
            ⁡
            64000
          
        
        )
        =
        O
        (
        
          n
          
            2.78
          
        
        )
      
    
    {\displaystyle O(n^{\log _{54}64000})=O(n^{2.78})}
  
. (Тензорное умножение алгоритма на себя с циклическим сдвигом аргументов приводит к алгоритму для квадратных матриц <54x54x54; 64000> с той же сложностью). Для реального ускорения умножения требуется существенная оптимизация — удаление множества дублирующих вычислений в линейных формах.
 По состоянию на 2022 год это асимптотически наиболее быстрый практически реализуемый билинейный алгоритм для произвольного поля элементов матриц.
 В 2022 году компанией DeepMind при помощи нейросетевого алгоритма AlphaTensor были найдены несколько новых алгоритмов перемножения матриц различных размерностей. Однако их скорость для произвольного поля далека от скорости известных лучших алгоритмов. Так для матриц 4X4 алгоритм Штрассена требует 49 умножений, а AlphaTensor нашёл алгоритм, требующий 47 умножений, но работает он только для поля 
  
    
      
        
          Z
        
        
          /
        
        2
        
          Z
        
      
    
    {\displaystyle \mathbb {Z} /2\mathbb {Z} }
  
.